sed s 命令 & e 标志: `echo '$-' | sed 's/-//e'` 给出: `sh: $: 命令未找到`

sed s 命令 & e 标志: `echo '$-' | sed 's/-//e'` 给出: `sh: $: 命令未找到`

我有问题sed,当使用它的 's' (搜索和替换命令)及其 'e' 标志,如

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

我错过了什么或做错了什么?

答案1

跑步

echo '$-' | sed 's/-//e'

删除-from $-,只留下$,结果作为 shell 命令运行,因为/e.

$如果您尝试从命令行运行,结果是相同的:

sh: $: command not found

对于所有其他线路也类似。

相关内容