我有一個非常大的文件,運行多個sed命令,我想避免內存不足錯誤並節省時間。這些都是等同的嗎?是否有多個表達式與具有分號的表達式相同?
sed -e 'expr1' -e 'expr2' -e 'expr3' file
sed 'expr1;expr2;expr3' file
sed expr1 file | sed expr2 | sed expr3
我的猜測是,在管道(3),流分開每次處理,因此這將需要3倍,只要比(2)只處理一次)。但我不確定內部過程如何(1)。
我有一個非常大的文件,運行多個sed命令,我想避免內存不足錯誤並節省時間。這些都是等同的嗎?是否有多個表達式與具有分號的表達式相同?
sed -e 'expr1' -e 'expr2' -e 'expr3' file
sed 'expr1;expr2;expr3' file
sed expr1 file | sed expr2 | sed expr3
我的猜測是,在管道(3),流分開每次處理,因此這將需要3倍,只要比(2)只處理一次)。但我不確定內部過程如何(1)。
首先,sed -e 'expr1' -e 'expr2' file
與sed '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
。
我不確定如果你的第一個表達式消耗多行,會發生什麼,但我想這是使用管道的好時機。感謝您的詳細解答! – pfctdayelise
@pfctdayelise你有這樣的第一個表達的例子嗎? Sed可以在一次傳球中做幾乎任何事情,並且有一些控制空間的詭計。 (很多時候,使用awk會容易得多) –
類似於 expr1:如果'^ foo $'後跟'^ bar $',則用baz替換foo; expr2:s/bar/BAR/g 'foo''消耗掉'後面的'bar'還是不是第一個exp2? – pfctdayelise
你對你的猜測是對的,1與2相同。 –
@ BenjaminW.maybe寫一個答案解釋你如何知道? – pfctdayelise
'-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