sed - 匹配后插入一行,双线标签用于插入行的开头

时间:2017-06-14 23:21:12

标签: awk sed

我有以下input.txt:

        "loop:\n\t" 
        "add %%g1, 1, %%g1\n\t" 

我想在第一行和第二行之间插入一行以获得:

    "loop:\n\t" 
    "add %%g1, 1, %%g1\n\t" 
    "add %%g1, 1, %%g1\n\t" 

这是我试过的:

sed '/loop\:/a "\t \t add %%g1, 1, %%g1\\n\\t"' input.txt

但有了这个,我得到了:

        "loop:\n\t" 
"       add %%g1, 1, %%g1\n\t" 
        "add %%g1, 1, %%g1\n\t" 

正如您所看到的,插入行的第一个引用位于行的开头,而不是add字之前的juste。

如何规避这个问题?

由于

更新1:

我意识到每行开头和第一个字符之间的空格不是制表而是经典空间。

然后,我尝试使用此解决方案(来自this link

awk '{print} /loop\:/{ print substr($0,1,match($0,/[^[:space:]]/)-1) "add %%g1, 1, %%g1\n\t"}' input.txt

似乎这个命令行计算了前一行的右缩进,但不幸的是,我得到了这个:

           "loop:\n\t" 
"add %%g1, 1, %%g1\n\t" 
           "add %%g1, 1, %%g1\n\t" 

虽然我想:

           "loop:\n\t" 
           "add %%g1, 1, %%g1\n\t" 
           "add %%g1, 1, %%g1\n\t" 

你能看到错误吗?

此致

2 个答案:

答案 0 :(得分:1)

sed用于单个行上的简单替换,即全部。对于任何更有趣的东西,只需使用awk代替清晰度,便携性,效率和软件的大多数其他理想属性:

$ awk '{print} /loop:/{print "\t\"add %%g1, 1, %%g1\\n\\t\""}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

以上只是实现了你试图用sed做的事情,但根据你的实际需求,可能有更好的方法,例如:任何这些都有上述优点,但在不同条件下产生相同的输出:

$ awk '1;NR==2' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"


$ awk '{print} f{print;f=0} /loop:/{f=1}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

$ awk '{print} /loop:/{sub(/".*/,""); print $0 "\"add %%g1, 1, %%g1\\n\\t\""}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

根据你在a previous answer of mine下留下的评论,听起来你确实想要其中一个,所以你不必指定缩进。

答案 1 :(得分:1)

使用GNU sed:

使用反斜杠首先逃离\t

sed '/loop\:/a \\t "add %%g1, 1, %%g1\\n\\t"' file

或搜索和替换:

sed 's/loop\:.*/&\n\t "add %%g1, 1, %%g1\\n\\t"/' file