我有问题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
对于所有其他线路也类似。