我有以下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单词之前。
如何规避这一问题?
谢谢
更新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" 你能看到错误吗?
问候
发布于 2017-06-14 23:29:09
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下留下的注释,听起来您确实想要其中的一个底部,所以您不必指定缩进。
发布于 2017-06-14 23:29:32
与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"/' filehttps://stackoverflow.com/questions/44556152
复制相似问题