使用带有e替换选项的sed:s /// e

时间:2012-06-26 00:25:33

标签: sed

我在使用在替换模式中执行命令的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 \ n没有从匹配的字符串中删除。

我想要执行的完整命令是:

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

2 个答案:

答案 0 :(得分:2)

删除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);

答案 1 :(得分:2)

  

); 345678

echo输出12345678后跟\r,后者将光标移回行首,);导致您在窗口中看到的字符串。在命令末尾添加|od -cx以查看。

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

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