Shell 为什么在awk printf中使用变量不';不行?

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 '$

我是新手。我正在尝试使用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 '$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扩展,并引用它是一个真正令人头痛的问题。使用
    -v
    巧妙地传入任何shell变量

  • 您需要使用逗号分隔符分隔
    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中。