什么是" e"在GNU sed中对s ///命令的修饰符是什么意思?

时间:2016-08-23 03:49:25

标签: sed

我已阅读s///命令的sed手册。它说:

  

e

     

此命令允许用户将shell命令的输入传递给模式       空间。如果进行了替换,则找到的命令       执行模式空间,并将模式空间替换为其输出。       尾随换行被抑制;如果命令,结果是不确定的       要执行包含一个空字符。这是一个GNU sed扩展。

我不知道什么是有用的:

echo "1234" | sed 's/1/echo ss/e'
echo "1234" | sed 's/1/ss/'

这两个命令的结果相同,那么e修饰符的含义是什么?

2 个答案:

答案 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将模式空间与保持空间交换,这基本上是另一个内置变量,您可以将其用于任何您想要的任何内容。)