bash 脚本中的 sed:未知命令:`''`

bash 脚本中的 sed:未知命令:`''`

有没有一种方法可以在 bash 脚本中使用sed包含撇号的命令',或者我是否需要更改该sed命令以使其不使用'

例如,我想运行这个 bash 脚本:

#!/bin/bash

cat file.txt | sed $'s|^\(some-string\)|\f\\1|'

sed命令应该在每次出现some-stringinside 之前添加换行符。这不起作用,因为脚本似乎只运行 cat 命令。

我还尝试在命令"周围添加引号sed

cat file.txt | sed "$'s|^\(some-string\)|\f\\1|'"

它返回错误:

sed: -e expression #1, char 2: unknown command: `''`

在 Ubuntu 16.04 标准 shell 上运行,带有sh script.sh.

答案1

对于$'...'C 字符串来说,\f是换页符 (FF, ^L)。换行符是\n换行符(LF,^J)。在标准中sed,在命令的替换部分中s,必须插入\后跟 LF 字符:

所以你要:

#! /bin/sh -
< file.txt sed '
  s|^some-string|\
&|'

$'...'

#! /bin/bash -
< file.txt sed $'s|^some-string|\\\n&|'

使用 的 GNU 实现sed,您还可以\n在替换中使用 来表示换行符/LF:

#! /bin/sh -
< file.txt gnu-sed 's|^some-string|\n&|'

无论如何,sed这些命令中都没有传递撇号。'...'$'...'是 shell 的引用运算符,第一个(标准)用于将内部内容逐字传递给sed,第二个(ksh93 扩展现在受到其他一些 shell 支持,包括bash)用于在传递给 之前扩展其中的序列\f,例如, 。\nsed

如果您想将文字传递'sed,例如向其传递y/'/"/用于替换's 的命令",则可以使用允许传递的 shell 引用运算符',其中包括所有引用运算符除了 '...'本身:

sed $'y/\'/"/'  # $'...' quoting operator
sed "y/'/\"/"   # "..." quoting operator
sed y/\'/\"/    # \x quoting operator

答案2

Posixly sed 完成此操作的方法是:

$ sed -e '/^some_string/!b'  - e 'H;s/.*//;x' filename 

相关内容