2016-07-04 52 views
2

假設下面的命令sed:爲什麼命令q添加一個新行?

echo -en "abc1\ndef2\nghi1" | sed -n 'p; d;' 

在這種情況下,輸出是一樣的,因爲這將是沒有SED的。所以最後一行仍然沒有換行符。下一個命令

echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; d;}' 

sed打印除最後一行外的所有內容,但未進行修改。最後一行縮短了一個字符。最後一行仍然沒有換行符。下一個命令

echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; q1;}' 

(「d」通過在最後的命令塊「Q1」所取代。輸出結果相同之前,但此時存在的最後一行的附加新行字符。

  • 爲什麼?
  • 如何解決

(對於那些誰感興趣的意向這個命令:給定一個特定的標準輸入,我要掃描的最後一個字符,對STDIN傳遞給STDOUT沒有這個拉斯t字符並根據該字符設置退出代碼。不應該有其他修改。 SED似乎是完美的,如果就不會有這個問題,換行

sed -n ' 
    $! {p; d;};   #print any non last line, do next cycle 
    /0$/ {s/0$//; p; d}; #last line ending with 0? Remove 0, print, next cycle 
    /1$/ {s/1$//; p; d}; #last line ending with 1? Remove 1, print, next cycle 
    {p}     #fall back, print last line 
' 

到目前爲止,這個腳本運行完美關於向新行的問題。沒有添加新行。現在,如果我用「Q」

sed -n ' 
    $! {p; d;};   #print any non last line, do next cycle 
    /0$/ {s/0$//; p; q0}; #last line ending with 0? Remove 0, print, exit 0 
    /1$/ {s/1$//; p; q1}; #last line ending with 1? Remove 1, print, exit 1 
    {p}     #fall back, print last line 
' 

換行符問題突然出現......

其他的解決方案,歡迎替換「d」命令,就應該儘可能地快。

+0

'q' cmd是否真的接受一個可選的整數參數還是隻是忽略它?如果將'q1'改爲'q',會發生什麼?很好的說明問題,祝你好運得到答案! – shellter

+0

是的,它接受一個可選的整數。該整數用作退出代碼。但是一些手冊沒有說明這一點。 「q」只是「q0」的簡寫。 – Henning

回答

2

我想這是一個錯誤。根據手冊,如果禁用自動打印,q不應該打印圖案空間。因此,它不應該打印任何東西。由於您已在使用GNU sed,因此可以使用Q而不是q來避免此問題。至少,這適用於我(版本4.2.2)。

+0

是的,使用「Q」而不是「q」也解決了我的問題。非常感謝! – Henning