为什么不在第一个添加的行上插入选项卡?

Why won't the tab be inserted on the first added line?

我正在尝试向一个文件中添加多行,所有行都带有制表符。这些行应在匹配字符串后插入第一行。

假设一个只有一行的文件,名为"my-file.txt"如下:

foo

我尝试了以下 sed 命令:

sed "/^foo$/a \tinsert1\n\tinsert2" my-file.txt

这会产生以下输出:

foo
tinsert1
    insert2

请注意应该位于第一行(插入的)的制表符是如何被省略的。相反,它会打印一个额外的前导 't'.

为什么?以及如何更改我的命令以按预期在第一行打印选项卡?

使用 GNU sed:

sed '/^foo$/a \tinsert1\n\tinsert2' file
     <---- single quotes!      --->

产生:

foo
    insert1
    insert2

来自手册:

  a \

  text   Append text, which has each embedded newline preceded by a backslash.

由于要追加的文本本身必须以反斜杠开头,因此开头必须是 \t


PS:如果因为要注入 shell 变量而需要在 sed 命令周围使用双引号,则需要转义要附加的文本之前的 \:

ins1="foo"
ins2="bar"
sed "/^foo$/a \\t${ins1}\n\t${ins2}" file

sed 用于对单个字符串执行 s/old/new,仅此而已。只需使用 awk:

$ awk '{print} [=10=]=="foo"{print "\tinsert1\n\tinsert2"}' file
foo
        insert1
        insert2

以上内容可以在每个 UNIX 机器上使用任何 shell 中的任何 awk 进行工作,并且可以轻松修改以执行您将来可能想做的任何其他事情。