我正在使用 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
因为您所需要的只是字符串周围的双引号。