2012-06-22 48 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

相關問題