sed:-e表达式#1,char 62:未知命令:`\'

时间:2016-12-20 18:36:33

标签: sed

我正在尝试添加

-
  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:未知命令:`\'

我如何实现所需?

1 个答案:

答案 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,那么你不必担心这个琐事。