我正在尝试向文件添加多行,所有行都以制表符开头。匹配字符串后,应将这些行插入第一行。
假设文件只有一行,称为“ my-file.txt”,如下所示:
foo
我尝试了以下sed命令:
sed "/^foo\$/a \tinsert1\n\tinsert2" my-file.txt
这将产生以下输出:
foo
tinsert1
insert2
请注意应如何省略应该在第一行(插入)的选项卡。相反,它会打印一个额外的前导“ t”。
为什么?以及如何更改命令以按预期在第一行上打印选项卡?
答案 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进行工作,并且修改后可以做您将来可能要做的任何其他事情。