如何将 sed 输出通过管道传输到 printf 进行格式化?

如何将 sed 输出通过管道传输到 printf 进行格式化?

我正在使用 Tecplot 来处理风洞数据,但是 Tecplot 的输入需要特定的格式来指定变量;每个变量都用双引号括起来"Variable Name"。问题是获得双引号并不容易。我在一篇文章中发现printf ' "%s" '可以产生这种效果。然而, printf 对于输入内容相当挑剔。我无法sed在之前使用 a 从数据文件中传输变量printf,但是,我发现另一篇文章指出使用printf ' "%s" ' $(sed ...).这个结构有效,但只是解决我的问题的一半。我现在想使用它的输出printf来替换 with ,sed以将占位符 (XYZXYZXYZ) 与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

您的问题是,您正在尝试用 中的多行输出替换字符串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因为您所需要的只是字符串周围的双引号。

相关内容