【问题标题】:Using sed with e substitution option: s///e使用带有 e 替换选项的 sed:s///e
【发布时间】:2012-06-27 07:01:51
【问题描述】:

我在使用以替换模式执行命令的 sed 替换选项时遇到问题。我相信这个选项是对GNU sed 的扩展,但我找不到任何关于它的文档。有谁知道吗?

我的问题是使用执行替换选项时无法正确提取匹配的文本。我在 Mac OSX 10.7.4 上使用 GNU sed 4.2

echo "12345678\r" | sed 's/.*/echo "&);"/e'

Result: );345678
Desired Result: 12345678);

我尝试过使用不同的正则表达式匹配,例如 \d+,但这似乎破坏了使用 /e 替换选项的能力。而且我尝试使用显式捕获组,例如 \1 而不是 & 但这似乎也破坏了 /e 选项。

更新:

我的示例可能过于简单了,我最终想要做的是获取一个文本文件,其中每一行都包含一个唯一值并将其传递给 sed 并使用 uuidgen 命令(与我发布的previous question 相同的方式)。我遇到的新问题是因为我现在在 Mac 上运行命令 \r 没有从匹配的字符串中删除。

我要执行的完整命令是:

sed 's/.*/echo "blah blah `uuidgen`,&):"/e' file.txt

更新 2:

在我的 Mac 终端中,我不需要使用 echo -e 来将 \r 解释为换行符,实际上根据“man echo”,没有 -e 选项。在所有终端环境之间移动确实让生活变得困难:(。

感谢 kev,我能够想出一个适用于 Mac 的解决方案。

sed 's/\r//; s/.*/ echo "blah blah (`uuidgen`,&);"/e' file.txt

【问题讨论】:

  • Mac OSX 10.7.4 上的 GNU sed 4.2
  • e 选项记录在 GNU sed manual 中。

标签: sed


【解决方案1】:

删除e 标志:

$ echo "12345678\r" | sed 's/.*/echo "&);"/'
echo "12345678\r);"

添加e标志同:

$ echo -e "12345678\r);"
);345678

您可以删除\r:

$ echo "12345678\r" | sed -e 's/\\r//' -e 's/.*/echo "&);"/'
12345678);

【讨论】:

  • \r 是我在 sed 命令的实际输入中试图处理的内容。
  • 两阶段 sed 命令为我排序,我应该想到的。
  • 为什么会出现\r?来自 Windows 的数据?在处理之前转换为 Unix。考虑使用tr 命令删除\r
  • 是的,该文件来自 Windows。如何将 tr 应用于流? s/\r// 的 sed 方法非常完美。
【解决方案2】:

);345678

echo 输出的是12345678,然后是\r,它将光标带回行首,); 产生您在窗口中看到的字符串。在命令末尾加上|od -cx 即可查看。

在我的cygwin 安装中,我需要echo -e 来获得类似的行为。我无法在sed 中删除\r,但我可以通过添加tr 来完成:

$ echo "12345678\r" | sed 's/.*/echo -e "&);"/e'| tr -d "\r"
12345678);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多