2016-08-23 117 views
1

我已阅读s///命令的手册sed。在那里,它表示:在GNU sed中,s ///命令的“e”修饰符是什么意思?

e

该命令允许一个管道输入从shell命令到图案 空间。如果进行替换,将执行在 模式空间中找到的命令,并将模式空间替换为其输出。 尾随换行符被抑制;如果要执行的命令 包含一个空字符,则结果未定义。这是一个GNU sed扩展。

我不知道什么是有用的:

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

这两个命令导致相同的,那么什么是e修改呢?

+1

我建议用'/ touch'替换'/ echo'并看看'ls -ltr'。 – Cyrus

回答

2
$ printf "%s\n" 1234 2345 3456 | 
> sed -e 's/\(..\)\(..\)/echo $((\1 * \2))/e' 
408 
1035 
1904 
$ 

printf命令呼应3 4-三行数字。 sed脚本将每行分成一对2位数字,创建一个命令echo $((12 * 34)),例如运行它,输出(对于给定值为408)包含在(作为)模式空间中 - 然后将其打印出来。所以,对于这个脚本,两位数的数字相乘并显示结果。

,如果你愿意,你可以更大胆的尝试:

$ 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///命令实际上换人时间运行的外部命令。如果您的文件中有数百万行数据,则可能意味着执行了数百万条命令。

2

/e选项是一个GNU sed扩展名。它会将替换的结果作为命令传递给shell进行评估。注意:

vnix$ sed 's/a/pwd/' <<<a 
pwd 

vnix$ sed 's/a/pwd/e' <<<a 
/home/tripleee 

你的榜样引起相同的行为(回显完全替代文本),所以它是一个选择不当的例子。

开箱即用,模式空间引用当前输入行,但有一些方法可将其他内容放入模式空间。替换修改了模式空间,但还有其他一些sed命令以其他方式修改模式空间。 (对于一个简单的例子,x交换与保持空间模式空间,这基本上是另一种内置的变量,你可以使用任何你想要的。)