有没有一种方法可以在 bash 脚本中使用sed
包含撇号的命令'
,或者我是否需要更改该sed
命令以使其不使用'
?
例如,我想运行这个 bash 脚本:
#!/bin/bash
cat file.txt | sed $'s|^\(some-string\)|\f\\1|'
该sed
命令应该在每次出现some-string
inside 之前添加换行符。这不起作用,因为脚本似乎只运行 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
,例如, 。\n
sed
如果您想将文字传递'
给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