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

时间:2019-08-17 11:58:06

标签: sed gnu-sed

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

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

foo

我尝试了以下sed命令:

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

这将产生以下输出:

foo
tinsert1
    insert2

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

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

2 个答案:

答案 0 :(得分: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:如果由于要注入shell变量而需要在sed命令周围使用双引号,则需要对要附加的文本之前的\进行转义:

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

答案 1 :(得分:1)

sed用于对单个字符串进行s / old / new。只需使用awk:

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

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