使用sed反转生成文件

时间:2016-09-01 17:36:20

标签: 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 's/SHA1\*.*$/\dog/' sum2.txt > sum3.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 文件。

2 个答案:

答案 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 ?