使用Sed Ampers和Array替换


1

我试图使用sed的&符号替换原始字符串,然后从数组中读取,但它无法正常工作。我只是得到错误:'操作数预期(错误标记是“&”)'。

以下是相关的代码行:

gawk -F '\t' '{ print $5"\t"$1"\t"$2"\t"$3"\t"$4 }' $TEMPFILE | sed "s/^[0-9]\+/${CATEGORY[&]}/g"

第一个gawk语句在行的开头生成一个两位数字。如果我用手动替换sed语句中的&符号,一切正常。我真的很感激一些帮助。

Answers:


3

问题是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 )

我不熟悉复杂的awk语句,但这段代码似乎不起作用。它打印的唯一内容就是你最后回复的数字。
Sarah C. Corriher 2016年

@ SarahC.Corriher:更新了category作业。
choroba 2016年

1

正如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的输入是恶意的),我也不建议使用它。


谢谢。虽然我会向其他人指出sed语句周围的引号必须是双引号才能使用。
Sarah C. Corriher 2016年

不。如果它们是双引号,shell会尝试扩展${CATEGORY[foo]},这会破坏脚本(或者我误解了你要做的事情)。我专门使用单引号来避免这种情况,因此sed会${CATEGORY[foo]}逐字看到(并最终输出)。
AndrásKorn2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.