使用awk时出现问题

| 我无法解决这个问题。当我执行此程序时,出现以下错误 \“第7行:寻找匹配的'\'\'\”时出现意外的EOF”
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]; then
var1=`echo $a | awk -F\"U\" \'\\
{
var2=`echo $var1 | awk -F\"a\"
{print \" \"$2}\'`
}\\
fi
更新:来自其他最近关闭的问题 更具体地说,这是我的项目代码
if [ \"$FORMAT\" = \"java\" ]; then
        cat $INPUT_FILE | awk -F\":\" \'\\
                /^$/ { print \"\" }\\
                /^\\/\\/.*/ { print \"     \"$0}\\
                /:string:/ { print \"    public static final String \"$1\" = \"$3\";\" }\\
                /:char:/   { print \"    public static final char \"$1\" = \"$3\";\" }\\

/:ullong:/ { print \"    public static final long \"$1\" = \"$3\";\" }\\
                /:ulong:/  { print \"    public static final int \"$1\" = \"$3\";\" }\\
                /:long:/   { print \"    public static final int \"$1\" = \"$3\";\" }\\
        \' >> $CONST_FILE
fi;
现在我需要将$ 3(实际上是从另一个文件读取的值)截断为两部分(仅用于ullong)。可以说
$3=1256985361455ULL
我需要截断为1256985361455和ULL。 (仅当它是ullong时) 请帮我解决这个问题。 我尝试在下面使用另一个awk,但最终陷入混乱。
/:ullong:/ { print \"    public static final long \"$1\" = \"$3\";\" }\\
已邀请:
如果您希望ullong记录的$ 3值类似于\“ 1256985361455ULL \”,则
/:ullong:/ { 
    sub(/ULL$/, \"\", $3)
    print \"    public static final long \"$1\" = \"$3\";\" 
}
您的报价问题是因为一旦您启动了反引号命令,它就会一直持续到下一个反引号为止。这是您上面的代码,除了我已删除了空行。
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]; then
var1=`echo $a | awk -F\"U\" \'\\
{
var2=`echo $var1 | awk -F\"a\"
{print \" \"$2}\'`
}\\
fi
(很难在行内Markdown中显示反引号\'
`
\'。) 行“ 7”行开始有一个反引号表达式,该表达式终止于下一个未转义的反引号,即“ 8”之后的那个。然后,它读取该行的其余部分,并在下一行遇到一个单引号。当它寻找以下单引号时,没有任何引号-因此它报告一个错误。您可以演示以下步骤:
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]; then
var1=`echo $a | awk -F\"U\" \'\\
{
var2=\\`echo $var1 | awk -F\"a\"
{print \" \"$2}\'`
}\\
fi
上面的脚本在
var2=
之后的反引号之前有一个转义符(反斜杠),因此现在反引号中的命令扩展到
print
行之后的反引号。这仍然不是有效的shell;带有
}\\
的行与
fi
组合在一起以得到命令名称
}fi
,因此您仍然会遇到意外的EOF错误-因为缺少
if
末尾的
fi
。再次修改脚本:
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]; then
var1=`echo $a | awk -F\"U\" \'\\
{
var2=\\`echo $var1 | awk -F\"a\"
{print \" \"$2}\'`
#}\\
fi
这注释掉了大括号,并且shell脚本现在为'valid \';现在该轮到18岁了,开始抱怨它给出的脚本无效。
++ awk -FU \'{
var2=`echo $var1 | awk -F\"a\"
{print \" \"$2}\'
awk: syntax error at source line 2
 context is
     >>> var2=` <<< 
awk: illegal statement at source line 2
awk: illegal statement at source line 2
    missing }
其他人大致给了您所需的答案。我可能会使用Perl进行拆分(并且我怀疑如果我花足够的时间在中间数组ѭ20上,会产生行噪声脚本,那么我可能会丢失中间数组ѭ20):
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]
then var1=$(echo $a | perl -ne \'@x=split /[aU]/; print \"$x[1]\\n\"\')
fi
但是,您也可以用
awk
在一行中完成此操作,因此:
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]
then var1=$(echo $a | awk -Fa \'{sub(\"ULL\",\"\",$2); print $2}\')
fi
这会将输入拆分为\'a \'而不是\'U \';然后从第二个字段中删除\'ULL \'并进行打印。如果要在\'U \'上分割,则使用:
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]
then var1=$(echo $a | awk -FU \'{sub(\"[0-9]+a\", \"\", $1); print $1}\')
fi
这样,.25中的正则表达式稍微复杂一些。
不确定确切要执行的操作,但是此略微重写打印出了a的中间部分(我认为这是您想要的)
> cat moo.sh
a=115292a1504606846976ULL
b=2
if [ \"$b\" = \"2\" ]; then
        var1=`echo $a | awk -F\"U\" \'{print $1}\'`
        var2=`echo $var1 | awk -F\"a\" \'{print \" \"$2}\'`
        echo $var2
fi
> sh moo.sh
1504606846976
您不能在ѭ18内执行shell命令,除非进行系统调用。不告诉我们您要达到的目标
#!/bin/bash
a=115292a1504606846976ULL
b=2
case \"$b\" in
 2 ) 
    a=${a%U*}
    echo ${a#*a} # I assume you want to get 1504606846976
esac
a=115292a1504606846976ULL
b=2

if [ \"$b\" = \"2\" ]; then
  var1=`echo $a | awk -F \"U\" \'{print $1}\' | awk -F \"a\" \'{print $2}\'`
fi

要回复问题请先登录注册