在GNU sed中,s ///命令的“e”修饰符是什么意思?
问题描述:
我已阅读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
修改呢?
答
$ 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///
命令实际上换人时间运行的外部命令。如果您的文件中有数百万行数据,则可能意味着执行了数百万条命令。
答
/e
选项是一个GNU sed
扩展名。它会将替换的结果作为命令传递给shell进行评估。注意:
vnix$ sed 's/a/pwd/' <<<a
pwd
vnix$ sed 's/a/pwd/e' <<<a
/home/tripleee
你的榜样引起相同的行为(回显完全替代文本),所以它是一个选择不当的例子。
开箱即用,模式空间引用当前输入行,但有一些方法可将其他内容放入模式空间。替换修改了模式空间,但还有其他一些sed
命令以其他方式修改模式空间。 (对于一个简单的例子,x
交换与保持空间模式空间,这基本上是另一种内置的变量,你可以使用任何你想要的。)
我建议用'/ touch'替换'/ echo'并看看'ls -ltr'。 – Cyrus