3

我能找到的每个演示w命令的示例sed在脚本末尾都有它。如果我做不到怎么办?

一个例子可能会更好地说明这个问题:

$ echo '123' | sed 'w tempfile; s/[0-9]/\./g'
sed: couldn't open file tempfile; s/[0-9]/\./g: No such file or directory

(如何)我可以更改上述内容以便sed知道文件名的结尾吗?

PS我知道我能做到

$ echo '123' | sed 'w tempfile
> s/[0-9]/\./g'
...

有更漂亮的选择吗?

PPS 人们倾向于建议将其拆分为两个脚本。那么问题来了:它安全吗?如果我要在w命令之后的某个地方分支怎么办,等等。有人可以确认任何脚本可以在任何命令之后分成两部分并且不会影响结果吗?

最终编辑:我检查了多个-e工作就像连接命令一样。我认为它更复杂(比如第一个应该总是在第二个开始之前退出,等等)。但是,我尝试{..}在两个脚本之间拆分一个命令块,它仍然有效,所以这w并不是一个严重的问题。谢谢大家。

4

4 回答 4

4

您可以在一个 shell 行中为 sed 提供两行脚本:

echo '123' | sed -e 'w tempfile' -e 's/[0-9]/\./g'
于 2012-06-22T15:22:38.453 回答
3

这可能对您有用(如果您使用的是 BASH 并且可能是 GNU sed):

echo '123' | sed 'w tempfile'$'\n'';s/[0-9]/\./g'

解释:

和命令需要换行符来终止文件rRw

于 2012-06-22T16:05:31.920 回答
2

问题的答案是“换行符”:

sed将非转义的文字换行符视为文件名的结尾。

如果你的 shell 是 bash,或者支持$'\n'语法,你可以这样解决 OP 的原始问题:

echo '123' | sed 'w tempfile'$'\n''s/[0-9]/\./g'

在更有限的sh情况下,您可以说

$ echo '123' | sed 'w tempfile'\
> 's/[0-9]/\./g'

我在这里所做的只是写\一个转义,然后按回车键并在那里写下命令的其余部分。请注意,我在这里转义换行符,bash但它被传递到sed.

于 2012-06-22T16:24:33.193 回答
0

像这样反转 2 个 sed 命令序列:

echo '123' | sed 's/[0-9]/\./g;w tempfile'

即首先执行替换,然后将模式空间写入文件。

编辑:对于 OP 是否希望在最终文件中替换文本存在一些误解。我上面的命令将替换的文本放在临时文件中。由于这不是 OP 想要的,因此还有一个版本可以避免它:

echo '123' | sed -e 'h;s/[0-9]/\./g;g;w tempfile'
于 2012-06-22T15:28:09.427 回答