Text-Processing
sed:用標準輸入替換多行塊
給定的是
input_file
:1 2 START foo END 3
目標是用stdin 中的多行內容替換 include
START
…塊中的內容:END
1 2 hello world 3
我嘗試了什麼:
sed '/^START$/,/^END$/d;r /dev/stdin' input_file <<EOF hello world EOF
不幸的是導致
1 hello world 2 3
我猜是在之後
r /dev/stdin
順序呼叫,只是在第一行之後追加。/^START$/,/^END$/d;
第二次嘗試:
sed '/^START$/,/^END$/{d;r /dev/stdin }' input_file <<EOF hello world EOF
印刷
1 2 3
為什麼上面的命令 - 特別是最後一個 - 列印錯誤的結果?我該如何調整這些?
在您的第一次嘗試中,地址範圍是
d
唯一有效的。(r /dev/stdin
append…) 是為第一行完成的;此後,它執行到文件結尾。在您的第二次嘗試中,腳本沒有遇到該r
命令。man sed
:d Delete pattern space. Start next cycle.
所以
d
命令後的一切都失去了(在相關的地址範圍內);它只是沒有r /dev/stdin
。試試這個來實現你的目標:
sed -e '/^START$/,/^END$/ { r /dev/stdin' -e';d};' file3 <<EOF hello world EOF 1 2 hello world 3
滿足地址範圍時首先讀取,然後刪除地址範圍。