1

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

假设一个文件只有一行,名为“my-file.txt”,如下所示:

foo

我尝试了以下 sed 命令:

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

这会产生以下输出:

foo
tinsert1
    insert2

请注意应该在第一(插入)行上的选项卡是如何被省略的。相反,它会打印一个额外的前导“t”。

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

4

2 回答 2

1

使用 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:如果您需要在 sed 命令周围使用双引号,因为您想注入 shell 变量,您需要转义要附加的文本之前的 \:

ins1="foo"
ins2="bar"
sed "/^foo\$/a \\\t${ins1}\n\t${ins2}" file
于 2019-08-17T12:28:13.823 回答
1

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

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

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

于 2019-08-18T08:47:13.247 回答