2014-09-18 22 views
0

在正常情況下,sed可以簡單地通過管道編輯從另一個命令流:重寫sed命令編輯流而不是文件

./somecommand | sed 's/xx/yy/g' 

然而,sed命令我使用的是一個有點複雜。此前,我已經得到幫助的特定使用案例優化sedOptimize shell script for multiple sed replacements

最終的結果是,對我的使用情況下,以下sed命令是最優化:

./somecommand > file 
sed -e 's/^/s|/; s/$/|g/;' replacement_list | sed -r -f - -i file 

基本上,第一個sed命令將創建一個帶有成對替換文件的sed操作列表。第二個sed命令然後通過管道使用該流,並利用-f選項來處理該文件。

事情已經改變了一點,因爲現在我已經設法得到somecommand輸出結果stdout而不是寫入文件,但我想不出一種方法來正確地重寫上述命令集。部分難點在於第二個sed命令已在使用來自第一個sed命令的流。

我試過的一件事是將的stdout分配給一個變量,並嘗試將它變成第二個sed命令。但是,這並不奏效。

回答

1

你可以通過使用shell的內聯擴展來解決這個問題(我認爲這就是它的名字,如果我錯了,請糾正我)。

./somecommand | sed -r -e "`sed -e 's/^/s|/; s/$/|g/;' replacement_list`" 

注雙引號內的反引號,這將導致內sed命令的標準輸出被放置在雙引號內。

雖然,這是很危險的,所以你可能想嘗試第一內sed命令的輸出保存到shell變量這樣

sedcommand="`sed -e 's/^/s|/; s/$/|g/;' replacement_list`" 
./somecommand | sed -r -e "$sedcommand" 
+0

hackish的和危險的,但似乎是正確的。 :-P – ghoti 2014-09-18 15:48:50

+0

效果很好。謝謝! – 2014-09-18 15:56:58

+0

'./somecommand | sed -r -e「$(sed -e's/^/s | /; s/$/| g /;'replacement_list)」'不再需要雙引號內的轉義或者使用雙引號而不是簡單或任何像's \ \ \ \ \ \ \ \ \ \ \ \ \ \/g'這樣的多重反斜槓 – NeronLeVelu 2014-09-19 06:43:09