提出这个问题。
假设我想替换<number with commas>
in <number>
string something, "10,000", something
。
数字可能是1,000
, 10,000
... 等等。
我正在试验是否可以使用命令进行替换:
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
这不起作用,没有任何反应。
触发我的问题是,如果我只使用echo
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
参数\\1
读取正常,但看起来无法通过管道传输到sed
(或grep
)。
这在某种程度上可能吗?
sed
作为表达式一部分的命令替换的扩展发生在sed
命令执行之前。这意味着shell,要执行命令
第一次运行
输出
\1
是因为 . 输出的字符串中没有逗号echo
。然后,shell 将这个字符串插入到命令替换所在的位置,产生
如果我们在 shell 中启用跟踪运行管道,这一点也很清楚:
在您的第二个管道中,发生了同样的事情(减去 的执行
sed 's/,//'
):结论:不可能使用命令替换从内部调用另一个 shell 命令
sed
来处理与正则表达式匹配的子字符串,因为命令替换是在sed
调用之前处理的(为了sed
在调用之前解析编辑脚本的内容sed
)。sed
此外,它的语言没有提供任何机制来调用另一个命令,就像其他一些编辑/处理语言所做的那样(例如,编辑器中的基本命令r
和w
命令ed
允许这样做awk
)。这仅在两个逗号之间至少有两个数字时才有效,所以