我试图使用sed的&符号替换原始字符串,然后从数组中读取,但它无法正常工作。我只是得到错误:'操作数预期(错误标记是“&”)'。
以下是相关的代码行:
gawk -F '\t' '{ print $5"\t"$1"\t"$2"\t"$3"\t"$4 }' $TEMPFILE | sed "s/^[0-9]\+/${CATEGORY[&]}/g"
第一个gawk语句在行的开头生成一个两位数字。如果我用手动替换sed语句中的&符号,一切正常。我真的很感激一些帮助。
我试图使用sed的&符号替换原始字符串,然后从数组中读取,但它无法正常工作。我只是得到错误:'操作数预期(错误标记是“&”)'。
以下是相关的代码行:
gawk -F '\t' '{ print $5"\t"$1"\t"$2"\t"$3"\t"$4 }' $TEMPFILE | sed "s/^[0-9]\+/${CATEGORY[&]}/g"
第一个gawk语句在行的开头生成一个两位数字。如果我用手动替换sed语句中的&符号,一切正常。我真的很感激一些帮助。
Answers:
问题是shell首先扩展双引号字符串,然后将扩展字符串作为参数发送到sed。但是,Sed不知道如何扩展shell变量。
你应该可以awk
直接进行,但是:
category=(red amber green)
awk -f <( # This generates the awk code:
echo '{';
for (( i=0; i<${#category[@]}; i++ )) ; do
echo category"[$i]"=\"${category[$i]}\"
done
echo 'print $1, category[$1]}'
) <( # This is the input file.
echo 0; echo 1 ; echo 2 )
category
作业。
正如choroba指出的那样,你的问题是你的shell会${CATEGORY[something]}
在传递给sed之前尝试扩展。
如果你绝对想用从awk到sed的管道这样做,这是一个解决方法:
awk ... | sed 's/^[0-9]\+/echo ${CATEGORY[&]}/g' | bash
它的工作原理是使用sed构造读取数组的shell语句。这仍然只有在导出数组时才有效。
你也可以试试
eval $(awk ... | sed 's/^[0-9]\+/echo ${CATEGORY[&]}/g')
这也可以在没有导出数组的情况下工作。
除非你能100%确定你的sed脚本不会产生任何危险命令(即使awk的输入是恶意的),我也不建议使用它。
${CATEGORY[foo]}
,这会破坏脚本(或者我误解了你要做的事情)。我专门使用单引号来避免这种情况,因此sed会${CATEGORY[foo]}
逐字看到(并最终输出)。