2012-06-22 67 views
3

我能找到的每个示例都演示sedw命令在脚本的最后。如果我不能这样做呢?如何让sed'w'命令知道文件名的结尾?

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

$ 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知道在哪里的文件名结束?

P.S.我知道我可以做

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

有更漂亮的选择吗?

P.P.S.人们倾向于建议将其分成两个脚本。问题在于:安全吗?如果我要在w命令之后的某个地方转移,那么该怎么办?等等。有人可以确认,任何脚本都可以分割成两个后任何命令,那会不会影响结果?

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

+1

为什么不把它分割成多个命令,如'echo'123'| sed -e'w tempfile'-e's/[0-9] /\./ g''。这不是你想要的吗? – Celada

+0

@Celada实际情况更复杂,一切都在递归“标签”内;也许我仍然可以以某种方式分裂它,但它可能是具有挑战性的,而且我不确定它总是可以完成的。 –

回答

4

可以得到一种两组行脚本在一个壳行的sed:

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

它是作为一个双行脚本还是作为两个脚本工作?我能否在不破坏逻辑的情况下,总是将脚本分成两部分? –

+0

如果你在这个命令后使用'cat tempfile',它仍然会显示'123'。 – anubhava

+0

@anubhava正如我上面写的,我担心更复杂的流量控制案例。所以我很好奇它是否可以一直这样做,不仅仅是为了这个简单的命令。 –

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' 
+0

@LevLevitsky:请参阅我编辑的答案,它可以在单个sed命令中完成,而不会将其分解为2. – anubhava

+0

该命令是有意的。对不起,我的例子一定是误导。 –

+0

啊我以为你想在tempfile中替换结果。 – anubhava

3

这可能为你工作(如果你使用bash,可能GNU SED):

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

说明:

r,Rw命令需要换行才能终止文件名。

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' 

我在这里写了\作为逃跑,然后按Enter键并在那里写下其余的命令。请注意,在这里,我从bash转义换行符,但它将传递给sed

相关问题