Bash 使用sed在文件中反转结果
我有一个名为sum.txt的文件,其中包含以下行: ccc7b3c6501338da68d0484d204994d82bbd9487?SHA1*myTest.feature= 如果我这样做: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
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 ?