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