我有以下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"
你能看到错误吗?
此致
答案 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