我在使用在替换模式中执行命令的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
答案 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);