【问题标题】:Awk statement in bash isn't executing when in for loopbash 中的 awk 语句在 for 循环中未执行
【发布时间】:2015-06-21 04:48:25
【问题描述】:

我有一个包含搜索词 (patts) 的文本文件,我需要从“patterns.txt”中删除它。我已经测试了 awk 语句并且它工作正常 - 除了在脚本中。

此外,当我回显到标准输出时,$target 变量正在正确打印。然而,由于某种原因,该语句没有正确执行。

#!/usr/local/bin/bash

input_file='patts'
i=0
while read line; do
  array[$i]=$line
  i=$((i+1))
done < "$input_file"
for (( i=0; i<${#array[@]}; i++ )); do
  target=`eval echo ${array[i]}`
  echo $target
  awk '!/$target/' patterns.txt > temp && mv temp patterns.txt
done

【问题讨论】:

    标签: linux bash loops awk


    【解决方案1】:

    Shell 变量不会以单引号展开。另外最好使用-v name=value 将参数传递给awk:

    awk -v target="$target" '!($0 ~ target)' patterns.txt > temp && mv temp patterns.txt
    

    不过看起来你可以用grep -v替换awk

    grep -v "$target" patterns.txt > temp && mv temp patterns.txt
    

    【讨论】:

    • 它返回“awk: non-terminated regular expression ($0 ~ $tar... at source line 1 context is >>>
    • 你为什么用$target,你没看到我的回答吗?
    • 当我使用 $0 ~ target 时做同样的事情
    • grep 的行为与awk 相同,并且两者都在执行正则表达式。如果要固定字符串搜索:grep -Fv "$target" patterns.txt &gt; temp &amp;&amp; mv temp patterns.txt
    • -x 用于精确匹配,-F 用于固定字符串匹配,这就是我上面写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多