我有一个名为 sum.txt 的文件,其中包含以下行:
ccc7b3c6501338da68d0484d204994d82bbd9487?SHA1 * myTest.feature =
如果我这样做:
sed -E 's/^.* \?/rabbit/' sum.txt > sum2.txt
在 sum2.txt 中,它给了我:
rabbitSHA1*myTest.feature
然后这个:
sed -E 's/SHA1\*.*$/\dog/' sum2.txt > sum3.txt
给了我这个:
rabbitdog
因此,我知道我的正则表达式在 sum.txt 的原始文本行上正常工作。
目标:我真正想做的是,将这两行放在原始文本文件中并将它们交换,所以 sum.txt 会看起来像:
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?
我尝试使用sed的占位符(\2
和\1
)来交换它们在文件中出现的顺序:
sed -E 's/\(^.* \?\)\(SHA1\*.*$\)/\2\1/' sum.txt > sum2.txt
或
sed 's/\(^.* ?\)\(SHA1\*.*$\)/\2\1/' sum.txt > sum2.txt
但它不起作用。我得到的结果是:
ccc7b3c6501338da68d0484d204994d82bbd9487 ?
问题:我做错了什么,我应该使用AWK来实现这一目标吗?
附录: 我在此用例场景中使用的上述文件是许多 sum.txt 文件之一。每个 sum.txt 文件与 sum.txt 中显示的文件一起驻留在不同的子目录中。因此,每个 sum.txt 都有一个唯一的哈希字符串和不同的 .feature 文件名,有时甚至使用不同于 .feature 的文件扩展名。例如,出现在不同子目录中的另一个 sum.txt 文件可能类似于:
2e1843ec8330588789790e86c72fd39903335608?SHA1 * yetAnother.test =
最终目标是在For Files递归循环中使用sed命令,该循环遍历每个子目录并修改许多 sum.txt 文件。
答案 0 :(得分:1)
您可以将?
匹配为已捕获的第1组,其余为第2组,然后替换它们进行交换:
sed -E 's/^([^?]+\?)(.*)/\2\1/' sum.txt
示例:强>
$ sed -E 's/^([^?]+\?)(.*)/\2\1/' <<<'ccc7b3c6501338da68d0484d204994d82bbd9487 ?SHA1*myTest.feature='
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?
答案 1 :(得分:0)
$ sed 's/\(.*?\)\(.*\)/\2\1/' file
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?
$ awk -F'?' '{print $2 $1 FS}' file
SHA1*myTest.feature=ccc7b3c6501338da68d0484d204994d82bbd9487 ?