Awk sed-匹配后插入行,插入行的开头有一个双制表符

Awk sed-匹配后插入行,插入行的开头有一个双制表符,awk,sed,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 但是有了这个,我得到了

我有以下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
word之前

如何规避这个问题

谢谢

更新1:

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

然后,我尝试使用这个解决方案(从)

这个命令行似乎从上一行计算出正确的缩进,但不幸的是,我得到了以下结果:

           "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" 
你能看到错误吗


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"

根据您在下面留下的注释,听起来您确实想要其中一个底部,这样您就不必指定缩进。

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"
根据您在下面留下的注释,听起来您确实想要其中一个底部,因此您不必指定缩进。

使用GNU时:

先用反斜杠转义
\t

sed '/loop\:/a \\t "add %%g1, 1, %%g1\\n\\t"' file
或搜索并替换:

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

先用反斜杠转义
\t

sed '/loop\:/a \\t "add %%g1, 1, %%g1\\n\\t"' file
或搜索并替换:

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

如果awk脚本产生了这种输出,那么您的awk将以非常具体和神奇的方式被严重破坏(我对此深表怀疑)<代码>打印。。。“add%%g1,1,%%g1\n\t”根本无法输出
“add%%g1,1,%%g1\n\t”
,因为传递给
print
的字符串不包含双引号,也无法摆脱反斜杠。如果awk脚本生成该输出,那么您的awk将以非常具体和神奇的方式被严重破坏(我对此深表怀疑)<代码>打印。。。“add%%g1,1,%%g1\n\t”无法输出
“add%%g1,1,%%g1\n\t”
,因为传递给
print
的字符串不包含双引号,也不会避开反斜杠。谢谢您的回答。你能给我一些关于我使用的命令的详细信息吗:*awk'{print}/loop:/{sub(/“*/”);print$0“\”添加%%g1,1,%%g1\\n\\t\\\'}**。你是否将块“loop:”替换为“loop:+”添加%%g1,1,%%g1\\n\\t\”??不客气
sub(/“*/,”)
删除
循环中第一行
之后的所有内容:
行(只留下前导空格缩进),然后
print$0“…”
打印该空格,后跟新字符串。最后一个问题:在这个命令中,如何插入新行“add%%g1…”,我的意思是,回线后的车厢在哪里?感谢
{print}
lust已经打印了循环行,就像其他所有现有行都是由该语句打印的一样,现在我们再次只在循环行(
/loop://
)上操作,以从“打开并在再次打印之前添加新字符串。谢谢您的回答。你能给我一些关于我使用的命令的详细信息吗:*awk'{print}/loop:/{sub(/“*/”);print$0“\”添加%%g1,1,%%g1\\n\\t\\\'}**。你是否将块“loop:”替换为“loop:+”添加%%g1,1,%%g1\\n\\t\”??不客气
sub(/“*/,”)
删除
循环中第一行
之后的所有内容:
行(只留下前导空格缩进),然后
print$0“…”
打印该空格,后跟新字符串。最后一个问题:在这个命令中,如何插入新行“add%%g1…”,我的意思是,回线后的车厢在哪里?感谢
{print}
lust已经打印了循环行,就像其他所有现有的行都是由该语句打印的一样,现在我们再次只在循环行(
/loop://
)上操作,以从“on”中删除并在再次打印之前添加新字符串。