要在第二個變化甜到綠色,再到最後一行,但只有在該行包含Sweet pepper
更換整條生產線倒數第二行,不管它包含什麼,胡蘿蔔:
$ sed 'x; ${s/.*/carrots/;p;x}; 1d' file.txt
cabbage
spinach
collard greens
corn salad
carrots
kale
它是如何工作
讓我們充分利用這個命令並檢查它的一個步驟的T A時間:
sed 'x; ${s/.*/carrots/;p;x}; 1d'
x
這種交換模式空間(持有最近讀線)和保持空間。
完成後,保持空間將包含最近讀取的行,並且模式空間將包含上一行。 (唯一的例外是,當我們剛纔所讀的第一行。在這種情況下,保持空間將有第一行和模式空間將是空的。)
${s/.*/carrots/;p;x}
當我們都在最後一行,由$
表示,模式空間保存着倒數第二行,我們可以執行任何我們喜歡的替換或其他命令。當我們完成後,我們打印倒數第二行p
。最後,我們交換模式,並再次使用x
保留空間,以便模式空間再次包含最後一行。 sed
將打印此項,因爲默認情況下,在命令的末尾,sed
將打印模式空間中的任何內容。
1d
當我們都在第一線,由1
指出,彭定康的空間是空的(因爲沒有前行),我們將其刪除(d
)。
一個更加簡單的方法
這種方法很容易以較低的執行速度爲代價來理解:
$ tac file.txt | sed '2 {/Sweet pepper/s/Sweet/Green/}' | tac
cabbage
spinach
collard greens
corn salad
Green pepper
kale
而且,胡蘿蔔:
$ tac file.txt | sed '2 s/.*/carrots/' | tac
cabbage
spinach
collard greens
corn salad
carrots
kale
如何它的工作原理:在這裏,我們使用tac
轉erse線的順序。注意:
$ tac file.txt
kale
Sweet pepper
corn salad
collard greens
spinach
cabbage
這樣,第二個到最後行成爲2號線。因此,我們只是簡單地告訴sed來對2號線運營之後,我們使用tac
再次把線,但按正確的順序。
sed的是區分大小寫的,我已經改變了'甜「到」甜「# – sjsam