Text-Processing

sed:用標準輸入替換多行塊

  • January 22, 2022

給定的是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/stdinappend…) 是為第一行完成的;此後,它執行到文件結尾。在您的第二次嘗試中,腳本沒有遇到該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

滿足地址範圍時首先讀取,然後刪除地址範圍。

引用自:https://unix.stackexchange.com/questions/687454