再會!
我試圖找出如何hold space與pattern space作業sed,所以我可以用它來替換多個字串。
例如,如果要將第一行和第二行替換為NEW STRING:
echo -e "aa\nbb\ncc\ndd\n"
aa
bb
cc
dd
為了獲得這樣的標準輸出:
NEW STRING
NEW STRING
cc
dd
我正在嘗試執行以下操作:
echo -e "aa\nbb\ncc\ndd\n" | sed -e 'commands'
我知道可以這樣做:
echo -e "aa\nbb\ncc\ndd\n" | tr '\n' '\0' | sed -e 's#aa#NEW STRING#;s#bb#NEW STRING#' | tr '\0' '\n'
NEW STRING
NEW STRING
cc
dd
但是你如何在不使用的情況下解決這個問題tr?
您還可以建議我們不知道行號的情況嗎?我們只知道那aa之后bb。
uj5u.com熱心網友回復:
sed 命令接受一系列要操作的行:
$ printf "%s\n" aa bb cc dd | sed '1,2s/.*/NEW STRING/'
NEW STRING
NEW STRING
cc
dd
有些人喜歡s在范圍內的單個行上作業,有些人將整個范圍視為一個塊來應用命令:
$ printf "%s\n" aa bb cc dd | sed '1,2c\
NEW STRING'
NEW STRING
cc
dd
例如,一行是 aaa,另一行是 bbb。我們知道 aaa 出現在 bbb 之前,但我們不知道它們在檔案中的編號。
我拼湊的一種方法(可能有更好的方法;并且只用 GNU 測驗過sed)
$ printf "%s\n" qq rr aa bb cc aa xx dd |
sed '/^aa$/{N; /^aa\nbb$/{s/.*/NEW STRING\nNEW STRING/; p; d}; P; D}'
qq
rr
NEW STRING
NEW STRING
cc
aa
xx
dd
如果當前行是aa,N則將下一行追加到當前模式空間。如果現在是aa\nbb,用兩行NEW STRING替換它,列印出模式空間,洗掉它并用新行重新開始。如果模式空間有其他內容,則列印出第一個換行符之前的所有內容,從模式空間中洗掉該文本,然后從其中讀取的第二行重新開始N。
uj5u.com熱心網友回復:
如果目標是試驗模式空間和保持空間,那么這將是一個例子:
echo -e "aa\nbb\ncc\ndd" | sed '1{ s/.*/NEW STRING/; h}; 2g'
輸出:
新字串 新字串 抄送 日
替換第一行,NEW STRING然后復制模式空間以保留空間 ( h)。在第二行復制空間到模式空間 ( g)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383850.html
