Bash 使用sed在文件中反转结果

Bash 使用sed在文件中反转结果,bash,shell,unix,awk,sed,Bash,Shell,Unix,Awk,Sed,我有一个名为sum.txt的文件,其中包含以下行: ccc7b3c6501338da68d0484d204994d82bbd9487?SHA1*myTest.feature= 如果我这样做: sed-E's/^.*\?/rabbit/'sum.txt>sum2.txt 在sum2.txt中,它给了我以下信息: rabbitSHA1*myTest.feature 那么这个, sed-E的/SHA1\*.$/\dog/'sum2.txt>sum3.txt 在sum3.txt中,我得到了以下信息: r

我有一个名为sum.txt的文件,其中包含以下行:

ccc7b3c6501338da68d0484d204994d82bbd9487?SHA1*myTest.feature=

如果我这样做:

sed-E's/^.*\?/rabbit/'sum.txt>sum2.txt

在sum2.txt中,它给了我以下信息:

rabbitSHA1*myTest.feature

那么这个,

sed-E的/SHA1\*.$/\dog/'sum2.txt>sum3.txt

在sum3.txt中,我得到了以下信息:

rabbitdog

因此,我知道我的正则表达式在sum.txt的原始文本行上工作正常

目标:我真正想做的是,将这两段文字在原始文本文件中交换,因此sum.txt看起来像:

SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487?

我尝试使用sed的占位符(
\2
\1
)来交换它们在文件中的显示顺序:

sed-E的/\(^.*\?\)\(SHA1\*.*$\)/\2\1/'sum.txt>sum2.txt

sed的/\(^.*?\)\(SHA1\*.*$\)/\2\1/'sum.txt>sum2.txt

但它不起作用。我得到的结果是:

ccc7b3c6501338da68d0484d204994d82bbd9487?

问题:我做错了什么?我应该使用AWK来实现这一点吗

附录: 我在这个用例场景中使用的上述文件是许多sum.txt文件之一。每个sum.txt文件与sum.txt中显示的文件位于不同的子目录中。因此,每个sum.txt都有一个唯一的哈希字符串和不同的.feature文件名,有时甚至具有不同的文件扩展名,而不是.feature。例如,出现在不同子目录中的另一个sum.txt文件可能类似于:

2E1843EC833058889790E86C72FD39903335608?SHA1*yetAnother.test=


最终目标是在For Files递归循环中使用sed命令,该循环遍历每个子目录并修改许多sum.txt文件。

您可以将till
匹配为捕获的组1,其余的则在组2中,然后将其替换为:

sed -E 's/^([^?]+\?)(.*)/\2\1/' sum.txt
示例:

$ sed -E 's/^([^?]+\?)(.*)/\2\1/' <<<'ccc7b3c6501338da68d0484d204994d82bbd9487 ?SHA1*myTest.feature='
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?

$sed-E的/^([^?]+\?)(.*)/\2\1/”虽然这对我提供的用例有效,但这不适用于包含唯一哈希字符串和文件名的多个文件。正在为我拥有的每个.feature文件生成文件。如果我有多个.feature文件分布在多个子目录中,则此解决方案在For files循环中不起作用。这不起作用。使用这两种解决方案,返回的结果是
ccc7b3c6501338da68d0484d204994d82bbd9487?
Yes它确实有效,请参见上文。你做错了什么,或者你的输入看起来不像你在问题中说的那样。是的,是的。我想弄明白为什么第一次没有成功。我试了好几次,然后毫无喜悦地回答。我的错误-道歉,谢谢你的回答。我知道为什么它最初对我不起作用。我的文件以回车换行符(CLRF)格式保存。当更改为换行(LF)时,您的解决方案可以工作。是否有一个正则表达式可以与sed或awk一起使用以适应这种情况?我不知道为什么我的文件会以这种方式保存,现在这是我要解决的下一个问题。我一定会看看。谢谢你的推荐。
$ sed 's/\(.*?\)\(.*\)/\2\1/' file
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?

$ awk -F'?' '{print $2 $1 FS}' file
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?