使用 Sed 中的 & 符号替换和数组

使用 Sed 中的 & 符号替换和数组

我尝试使用 sed 的 & 符号替换原始字符串,然后从数组中读取,但不起作用。我只收到错误:“应为操作数(错误标记是“&”)”。

以下是相关代码行:

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

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

答案1

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

答案2

正如 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 的输入是恶意的),否则我不会推荐任何解决方案。

相关内容