Sed

如何將 sed 輸出通過管道傳輸到 printf 以進行格式化?

  • October 28, 2019

我正在使用 Tecplot 處理風洞數據,但 Tecplot 的輸入需要特定格式的變數規範;每個變數都用雙引號括起來"Variable Name"。問題是獲得雙引號並不容易。我在一篇文章中發現printf ' "%s" '會產生這種效果。然而, printf 對輸入的內容相當挑剔。sed我之前一直無法printf使用printf ' "%s" ' $(sed ...). 這個結構有效,但只是解決我的問題的一半。我現在想用 this 的輸出printf替換sedprintf ' "%s" ' $(sed ...). 我得到的只是一個未終止的's

sed s/XYZXYZXYZ/` printf ' "%s" ' $(sed -n 1,265p Run-0020) `/ ../../wt/wt-layout_A.dat
sed: -e expression #1, char 12: unterminated `s' command

如前所述,如何將 XYZXYZXYZ 更改為 printf 的輸出?

嘗試將您的printf命令放在雙引號中。使用$(…)命令替換語法並在命令中添加單引號sed,它將是:

sed 's/XYZXYZXYZ/'"$(printf ' "%s" ' $(sed -n '1,265p' Run-0020))"/ ../../wt/wt-layout_A.dat

您可能可以刪除printf命令中的第一個空格字元,將其更改為printf '"%s" '.

您的問題是,您試圖用sed. 替換字元串可能沒有換行符。它們需要編碼為\n

一種解決方法可能是用不尋常的字元在替換字元串中編碼換行符,然後再次解碼它們 - 在中間只需在需要的地方添加引號:

sed \
  #replace newlines in input with END OF TEXT byte as separator
  #not using NUL byte as many shells ignore them
  #ignore newline on last entry
  -e "s/XXX/$(sed -n 1,265p RUNFILE | tr '\n' '\03' | sed 's/\x03$//' )" \
  #replace new separator by "<separator>", as well addin " at beginning and end of line
  -e 's/\x03/"\0"/g;s/^/"/;s/$/"/'
  #reintroduce newlines
  -e 's/\x03/\n/g' LAYOUTFILE > OUTPUT

樣本輸入

$cat LAYOUTFILE
XXX

$cat RUNFILE
1
....
300

$cat OUTPUT
"1"
....
"265"

PS:忽略使用printf你所需要的只是字元串周圍的雙引號。

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