2016-01-20 76 views
1

我有一個非常大的文件,運行多個sed命令,我想避免內存不足錯誤並節省時間。這些都是等同的嗎?是否有多個表達式與具有分號的表達式相同?

  1. sed -e 'expr1' -e 'expr2' -e 'expr3' file
  2. sed 'expr1;expr2;expr3' file
  3. sed expr1 file | sed expr2 | sed expr3

我的猜測是,在管道(3),流分開每次處理,因此這將需要3倍,只要比(2)只處理一次)。但我不確定內部過程如何(1)。

+0

你對你的猜測是對的,1與2相同。 –

+0

@ BenjaminW.maybe寫一個答案解釋你如何知道? – pfctdayelise

+0

'-e'選項還會使命令以換行符結束,允許命令'i','c','a'和以文件名結尾的命令如'w','W','r'和「R」被內聯寫入。另一個用途是與'-f'選項結合使用時作爲__package處理程序___,即fileA包含's/5/Z /'可以這樣插入:'seq 20 | sed -e '10,20 {'-f fileA -e'}'',第15行變爲'1Z'。 – potong

回答

1

首先,sed -e 'expr1' -e 'expr2' filesed 'expr1;expr2' file完全相同。也相當於是

sed 'expr1 
expr2' file 

和存儲

expr1 
expr2 

(或expr1;expr2)在一個文件中,例如,sedscr並用sed -f sedscr file調用它,或最後存儲

/usr/bin/sed -f 

expr1 
expr2 

在一個文件中sedscr並用./sedscr file來調用它。

對於每個輸入行,sed會遍歷整個腳本並將所有命令應用到它,然後轉到下一個輸入行。

另一方面,管道sed調用每次都會sed遍歷整個文件(併爲每個調用創建一個子shell)。這可能不會有很大的不同,如果你做的每一行的操作,但是想象一下換人鏈依賴於對方,像一個文件

xx 
xx 
pattern 
xx 
xx 
PATTERN 
xx 
xx 

,你想,在不區分大小寫的方式,結束在大括號PATTERN的圓括號內,無論你在哪找到它。如果您使用的管道作爲

sed 's/pattern/PATTERN/' infile | sed 's/PATTERN/(&)/' 

你通過文件兩次,三次手術總數:

Initial 1st pass 2nd pass 
xx  xx  xx 
xx  xx  xx 
pattern PATTERN (PATTERN) 
xx  xx  xx 
xx  xx  xx 
PATTERN PATTERN (PATTERN) 
xx  xx  xx 
xx  xx  xx 

sed 's/pattern/PATTERN/;s/PATTERN/(&)/' infile 

你得到同樣的結果,在短短一個通。所以,無論如何,嘗試將所有東西塞進一個命令中。

GNU sed可以在一個命令中完成:sed 's/pattern/\U(&)/' infile

+0

我不確定如果你的第一個表達式消耗多行,會發生什麼,但我想這是使用管道的好時機。感謝您的詳細解答! – pfctdayelise

+0

@pfctdayelise你有這樣的第一個表達的例子嗎? Sed可以在一次傳球中做幾乎任何事情,並且有一些控制空間的詭計。 (很多時候,使用awk會容易得多) –

+0

類似於 expr1:如果'^ foo $'後跟'^ bar $',則用baz替換foo; expr2:s/bar/BAR/g 'foo''消耗掉'後面的'bar'還是不是第一個exp2? – pfctdayelise

相關問題