我正在尝试添加
-
paths:
- /var/log/consumer.log
document_type: consumer
input_type: log
在我的文件中prospectors:
之后。我正在使用命令:
sed -i '/prospectors:/a\ \ \ \ \-
\ \ \ \ \ \ paths:\
\ \ \ \ \ \ \- \/var\/log\/consumer.log
\ \ \ \ \ \ document_type: consumer
\ \ \ \ \ \ input_type: log' new.txt
但是上面的命令给出了以下错误:
sed:-e表达式#1,字符62:未知命令:`\'
我如何实现所需?
答案 0 :(得分:1)
在经典(POSIX)sed
中,附加的每一行数据都需要在a
命令之后在它自己的行上,除了最后一行之外的所有行都需要在末尾加一个反斜杠来表示数据仍在继续。 GNU sed
允许与a
命令在同一行上的某些信息,但遵循规则。
还有一个皱纹:sed
从数据中删除前导空格。要获得前导空格,可以在开始时使用反斜杠。
因此,您最终可以:
sed -i '/prospectors:/a \
\ -\
\ paths:\
\ - /var/log/consumer.log\
\ document_type: consumer\
\ input_type: log' new.txt
领先的空白被忽略;反斜杠被删除;以下空格被复制到输出中。因此,如果输入只包含包含prospectors:
的行,则输出为:
prospectors:
-
paths:
- /var/log/consumer.log
document_type: consumer
input_type: log
显然,您可以调整间距以适合自己。
我注意到BSD sed
在-i
选项后需要后缀;可以-i ''
获取空字符串'后缀。要在GNU和BSD sed
之间移植,请使用-i.bak
(没有空格; GNU sed
不喜欢空格; BSD sed
接受附加的后缀,但是你不能附加一个空后缀)。并且-i
选项不是POSIX强制要求的,因此它不适用于所有类Unix系统。如果你只使用GNU sed
,那么你不必担心这个琐事。