我在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
答案 0 :(得分:2)
awk -v test="$var" '$0~"\\<"test"\\>"' tfile
记住regexp上下文中使用的字符串会被解析两次,一次读取时再执行一次,因此如果需要转义,则需要将所有内容转义两次。
另请注意,\<
仅限gawk。
根据更新的信息,您要搜索的文本可以包含RE元字符,您需要
如果你只有一对特定情况需要担心,那么逃离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
'