将变量传递给awk模式

时间:2018-04-18 15:32:42

标签: regex shell awk glob

我正在编写一个调用awk脚本的shell脚本,然后使用getline在BEGIN中获取一些用户输入,并将输入保存到某些变量中。

BEGIN {printf "What's the word?"
getline word < "-"
}

现在,其中一个变量被称为“word”,我想在脚本中的另一个模式中使用它来打印包含给定单词的所有行。我试过这样的事情:

/(^| )word( |$)/ 

将打印包含单词“word”的所有行,并且我知道它不会起作用,因为它不被识别为变量。我搜索了很多,发现了以

开头的模式
$0~

但在我的情况下,它不起作用。有没有办法可以将变量传递给这个模式并打印包含存储在变量中的单词的所有行?

2 个答案:

答案 0 :(得分:0)

如果您使用BEGIN部分构建具有完整模式的变量,您可以稍后参考:

awk -v word="hello" '
  BEGIN {
    pattern = "(^|[[:space:]])" word "([[:space:]]|$)"
  }

  $0 ~ pattern { print $0 }
'

...如果您不介意为每一行重建模式的开销,那么您甚至不需要这样做:

awk -v word="hello" '$0 ~ ("(^|[[:space:]])" word "([[:space:]]|$)") { print $0 }'

(为什么[[:space:]]代替?这样,标签和除了hex-20香草空格之外的其他空格字符也可以充当单词分隔符。)

答案 1 :(得分:0)

另一个替代方法是使用单词boundary,您可以在变量中应用一些反斜杠转义

<ng2-completer #openCloseSelect
            class="completer-limit"
            [datasource]="dataService4"
            [inputClass]="'form-control'"
            [minSearchLength]="0"
            [openOnFocus]="false"
            [placeholder]="'SCEGLI' | translate"
            [autoHighlight]="true"
            [selectOnClick]="true"
            [fillHighlighted]="false">
 </ng2-completer>

不确定所有 awk -v v="\\\y$word\\\y" '$0~v' file 都支持此功能。或者,您可以使用awk\<作为左右边界。