フォーマットのためにsed出力をprintfにパイプする方法は?

フォーマットのためにsed出力をprintfにパイプする方法は?

風洞データを処理するためにTecplotを使用していますが、Tecplotへの入力には変数を指定するための特定の形式が必要です。各変数は二重引用符で囲まれています"Variable Name"。問題は二重引用符を取得するのは簡単ではないということです。printf ' "%s" 'このような効果を出すことができる記事を見つけました。しかし、printfは入力内容に非常に面倒です。sedを使用する前にデータファイルから変数を転送することはできませんでしたが、使用することを説明するprintf別の記事が見つかりましたprintf ' "%s" ' $(sed ...)。この構造はうまくいきますが、私の問題の解決策は半分です。次に、出力を使用してプレースホルダ(XYZXYZXYZ)をに変換したいと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の出力にどのように変更しますか?

答え1

printfコマンドを二重引用符で囲みます。$(…)コマンド代替構文を使用してsedコマンドに一重引用符を追加すると、次のようになります。

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

printfコマンドから最初の空白文字を削除してそれをに変更できますprintf '"%s" '

答え2

問題は、.NETで文字列を複数行の出力に置き換えようとしていることですsed。代替文字列に改行文字を含めることはできません。次のようにエンコードする必要があります。\n

1つの回避策は、代替文字列の改行文字を珍しい文字にエンコードしてから再デコードすることです。途中で必要な場所に引用符を追加するだけです。

 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"

printfPS:文字列の周りに二重引用符が必要なので、使用を無視してください。

関連情報