如何让sed'w'命令知道文件名的结尾?

时间:2012-06-22 15:01:32

标签: file bash unix sed

我能够找到演示w的{​​{1}}命令的每个示例都在脚本的末尾。如果我不能那样做怎么办?

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

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 知道文件名的结束位置?

P.S。我知道我可以做到

sed

有更漂亮的选择吗?

P.P.S。人们倾向于建议将其拆分为两个脚本。问题是:它安全吗?如果我要在$ echo '123' | sed 'w tempfile > s/[0-9]/\./g' ... 命令之后转移到某处,那该怎么办?有人可以确认任何脚本可以在任何命令之后拆分为两个并且不会影响结果吗?

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

这可能适合你(如果你使用的是BASH,可能还有GNU sed):

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

说明:

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

答案 2 :(得分: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

答案 3 :(得分:0)

反转2个sed命令序列,如下所示:

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

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

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

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