当使用带有 ' e ' 标志的 ' s ' (搜索和替换命令)时,我遇到了sed的问题,如
sed 's/.../.../e'
问题是标准输入中的字符$
,(
和)
似乎混淆了它。
我第一次在这里遇到它,现在把它归结为:
echo '$-' | sed 's/x//e' # works when pattern is NOT matched
$-
echo '$-' | sed 's/-//e' # fails when pattern is matched: gags on $
sh: $: command not found
echo '-' | sed 's/-//e' # works when $ isn't present
echo '-(' | sed 's/-//e' # Also fails when '(' or ')' are found
sh: -c: line 1: syntax error: unexpected end of file
echo '(' | sed 's/-//e' # But works with this
(
echo '$-' | sed 's/-/echo xx/e' # also fails
sh: xx: command not found
echo '$-' | sed 's/\(-\)/echo '\1'/e' # also fails
sh: 1: command not found
这是GNU 手册所说的:
3.3 s 命令
...
s 命令后面可以跟零个或多个以下标志:
...
e
此命令允许将来自 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为其输出。尾随换行被抑制;如果要执行的命令包含 NUL 字符,则结果未定义。这是一个 GNU sed 扩展。
bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
sed --version
sed (GNU sed) 4.7
Packaged by Debian
我错过了什么或做错了什么?
跑步
删除
-
from$-
,只留下$
,结果作为 shell 命令运行,因为/e
.如果您尝试从命令行运行,结果是一样的
$
:对于所有其他行也是如此。