如何在使用变量数据时在awk中使用单词边界

时间:2015-02-24 19:56:46

标签: bash awk

我在awk

中遇到字边界问题
var="blue"

cat file
test
blue more
bluegrass not
yes red
more blue
fine blue, not

我只需要blue行,或多或少。

如果我这样做:

awk '/\<blue\>/' file
blue more
more blue
fine blue, not

我得到了我需要的输出(但这不使用变量)。


但是如何使用变量?

以下是我的一些测试:

awk '$0~"\<"test"\>"' test="$var" file
awk '$0~/\</test/\>/' test="$var" file
awk '{a="\<"test"\>"} $0~a' test="$var" file

所有这些都失败了。

仅需要awk,因为这是更大测试的一部分。


更新。
似乎我的一些变量确实包含+唱歌。这会使Ed

的解决方案失效
var="blue+"

cat file
test
blue+green more
bluegrass not
yes red
more blue+
fine blue+, not

awk -v test="$var" '$0~"\\<"test"\\>"' file
blue+green more
more blue+
fine blue+, not

1 个答案:

答案 0 :(得分:2)

awk -v test="$var" '$0~"\\<"test"\\>"' tfile

记住regexp上下文中使用的字符串会被解析两次,一次读取时再执行一次,因此如果需要转义,则需要将所有内容转义两次。

另请注意,\<仅限gawk。

根据更新的信息,您要搜索的文本可以包含RE元字符,您需要

  1. 转义可能出现在您的文字中的所有RE元字符,或
  2. 将其视为字符串
  3. 如果你只有一对特定情况需要担心,那么逃离RE元陨石是微不足道的,我确信你能解决这个问题,但是由于上下文敏感的特性,很难(不可能?)这些角色让我专注于如何检测不属于更长的单词的字符串&#34;:

    awk -v test="$var" '
        (s=index($0,test)) &&                            # test exists and is neither
        ((s>1?substr($0,s-1,1):"") !~ /[[:alnum:]_]/) && # preceded by a word char nor
        (substr($0,s+length(test),1) !~ /[[:alnum:]_]/)  # succeeded by a word char
    '