【问题标题】:what does the "e" modifier to the s/// command mean in GNU sed?s/// 命令的“e”修饰符在 GNU sed 中是什么意思?
【发布时间】:2016-08-23 03:49:25
【问题描述】:

我已经阅读了seds/// 命令的手册。上面写着:

e

此命令允许将来自 shell 命令的输入通过管道传输到模式中 空间。如果进行了替换,则在 模式空间被执行并且模式空间被它的输出替换。 尾随换行被抑制;如果命令结果未定义 要执行的包含一个空字符。这是一个 GNU sed 扩展。

不知道有什么用:

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

这两个命令的结果是一样的,那么e修饰符是什么意思?

【问题讨论】:

  • 我建议将/echo 替换为/touch 并查看ls -ltr

标签: sed


【解决方案1】:
$ 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)模式空间中——然后打印。因此,对于此脚本,两位数对相乘并显示结果。

如果你愿意,你可以变得更漂亮:

$ 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 将模式空间与 hold 空间交换, 这基本上是另一个内置变量,您可以随意使用它。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      相关资源
      最近更新 更多