1

我在使用以替换模式执行命令的 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 命令(与我发布的上一个问题相同)。我遇到的新问题是因为我现在在 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
4

2 回答 2

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);
于 2012-06-26T00:29:53.383 回答
2

);345678

接下来的echo输出将光标带回行首并产生您在窗口中看到的字符串。在命令的末尾放一个来查看。12345678\r);|od -cx

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

$ echo "12345678\r" | sed 's/.*/echo -e "&);"/e'| tr -d "\r"
12345678);
于 2012-06-26T00:53:38.893 回答