Shell 为什么在awk printf中使用变量不';不行?
我是新手。我正在尝试使用awk打印一些信息。所以我写了一个shell脚本Shell 为什么在awk printf中使用变量不';不行?,shell,awk,Shell,Awk,我是新手。我正在尝试使用awk打印一些信息。所以我写了一个shell脚本 #!/bin/bash turbVar="U" bcName="outlet" str="$turbVar $bcName b.c. = " # method-1 awk -v RS='}' '/'$bcName'/ { printf "%20s = %s\n" $str $4; exit;}' BCFile | tr -d ";" # method-2 awk -v RS='}' -v var1=$bcName '$
#!/bin/bash
turbVar="U"
bcName="outlet"
str="$turbVar $bcName b.c. = "
# method-1
awk -v RS='}' '/'$bcName'/ { printf "%20s = %s\n" $str $4; exit;}' BCFile | tr -d ";"
# method-2
awk -v RS='}' -v var1=$bcName '$0 ~ var1 { printf "%20s = %s\n" $str $4; exit;}' BCFile | tr -d ";"
BCFile
文件内容为
boundary
{
inlet
{
type fixedValue;
value uniform (5 0 0);
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
....
}
我希望输出类似的内容
U outlet b.c. = inletOutlet
遗憾的是,这不起作用。它抱怨awk:(FILENAME=0/U FNR=4)致命:参数不足,无法满足格式字符串%20s=%s
为什么我不能在awk printf中使用$str变量
第二个问题,哪种方法更好?使用
'/'$bcName'/
或使用-v var1=$bcName'$0~var1
?,为什么我不能直接使用'/$bcName/
或'/“$bcName”/
?这里的强引号和弱引号有什么区别?您清理的代码应该是:
awk -v RS="}" -v v1="$bcName" -v s="$str" '$0~v1{gsub(/;/,"");printf "%s%s\n",s,$4;exit}'
U outlet b.c. = inletOutlet
注:
- 不要玩弄shell扩展,并引用它是一个真正令人头痛的问题。使用
巧妙地传入任何shell变量-v
- 您需要使用逗号分隔符分隔
的参数printf
- 始终引用您的shell变量
- 您应该在
脚本中执行awk
,而不是gsub(/;/,”)
tr-d“
然而,这可能不是最好的方法,但我不能说,因为没有提供上下文。假设是什么?0/U它是一个文件。其内容见本帖
http://stackoverflow.com/questions/15825150/how-to-find-the-multiline-pattern-match-they-must-be-first-time-match
文件U
位于名为0
的文件夹中:)@sudo_O-仅供参考,不能使用正斜杠命名文件。nul字符“\0”也是如此。@Daniel-wrt您的问题是强引号和弱引号有什么区别。你认为什么是“强”VS“弱”引语?我们通常只讨论单引号和双引号。在你的脚本中,不做任何在你的问题中提到的备选方案——它们都是非常糟糕的。不,它不起作用。因为文件中有许多关键字<代码>出口>代码>,输出被弄乱了。(这是因为您希望从shell扩展$str
,而sudo_O可能没有扩展到这一点……但解决方案是在他的回答中:使用-v str=“$str]”传递值"
@TheodrosZelleke good spot错过了那一个,由于OP.LOL提供的新信息,@sudo_O,你能教我如何在我的情况下添加gsub
吗?所以我不再需要tr
。谢谢,我也很惊讶,因为在shell中printf不需要逗号,但我必须使用逗号在awk中。