我已阅读s///
命令的sed
手册。它说:
e
此命令允许用户将shell命令的输入传递给模式 空间。如果进行了替换,则找到的命令 执行模式空间,并将模式空间替换为其输出。 尾随换行被抑制;如果命令,结果是不确定的 要执行包含一个空字符。这是一个GNU sed扩展。
我不知道什么是有用的:
echo "1234" | sed 's/1/echo ss/e'
echo "1234" | sed 's/1/ss/'
这两个命令的结果相同,那么e
修饰符的含义是什么?
答案 0 :(得分:5)
$ printf "%s\n" 1234 2345 3456 |
> sed -e 's/\(..\)\(..\)/echo $((\1 * \2))/e'
408
1035
1904
$
此printf
命令在三行上回显三个4位数字。 sed
脚本将每一行拆分为一对2位数字,创建命令echo $((12 * 34))
,例如,运行它,输出(给定值为408)包含在(as)中图案空间 - 然后打印出来。因此,对于此脚本,将成对的2位数字相乘,并显示结果。
如果你愿意,你可以获得更多的爱好者:
$ printf "%s\n" 1234 2345 3456 |
> sed -e 's/\(..\)\(..\)/echo \1 \\* \2 = $((\1 * \2))/e'
12 * 34 = 408
23 * 45 = 1035
34 * 56 = 1904
$
请注意双反斜杠 - 这一点非常重要。您可以使用双引号来避免使用它:
printf "%s\n" 1234 2345 3456 |
sed -e 's/\(..\)\(..\)/echo "\1 * \2 = $((\1 * \2))"/e'
注意:每当s///
命令实际替换时,符号将运行外部命令。如果文件中有数百万行数据,则可能意味着执行了数百万条命令。
答案 1 :(得分:3)
/e
选项是GNU sed
扩展名。它会将替换的结果传递给shell以作为命令进行评估。观察:
vnix$ sed 's/a/pwd/' <<<a
pwd
vnix$ sed 's/a/pwd/e' <<<a
/home/tripleee
您的示例导致了相同的行为(完全回显了被替换的文本),因此这是一个选择不当的示例。
开箱即用,模式空间指的是当前输入行,但有一些方法可以在模式空间中放置其他内容。替换修改了模式空间,但还有其他sed
命令以其他方式修改模式空间。 (对于一个简单的例子,x
将模式空间与保持空间交换,这基本上是另一个内置变量,您可以将其用于任何您想要的任何内容。)