Bash 使用变量中的数据时如何在awk中使用单词边界
我在Bash 使用变量中的数据时如何在awk中使用单词边界,bash,awk,Bash,Awk,我在awk var="blue" 我只需要或多或少带有蓝色的行 如果我这样做: awk '/\<blue\>/' file blue more more blue fine blue, not awk-v test=“$var””$0~“\\”文件 蓝色+绿色更多 更蓝+ 精细蓝色+,不是 完美。对于普通的awk,这可能吗?不完全可能。对于仅仅搜索,您可以使用$0~”(^[^[:alnum:][u])“test”([^[:alnum:][u].$)”,但如果您使用它来使用匹
awk
var="blue"
我只需要或多或少带有蓝色的行
如果我这样做:
awk '/\<blue\>/' file
blue more
more blue
fine blue, not
awk-v test=“$var””$0~“\\”文件
蓝色+绿色更多
更蓝+
精细蓝色+,不是
完美。对于普通的awk
,这可能吗?不完全可能。对于仅仅搜索,您可以使用$0~”(^[^[:alnum:][u])“test”([^[:alnum:][u].$)”
,但如果您使用它来使用匹配()
或类似方法打印匹配字符串,那么很不幸,这会占用边界字符。@EdMorton我正要发布这个答案<代码>:P
。请参阅我更新的帖子。似乎我的一些var确实包含+
,这阻止了解决方案。最终和有效的解决方案。我知道模式在行尾,模式在“=”之后,我确实使用RS=“”
与组进行协作。所以我得到了:awk-v test=“$var”BEGIN{gsub(/\+/,“\\\\\&”,test)}$0~“=*“test”*\n”
现在可以很好地使用+
谢谢:)在这个上下文中+
意味着什么?它是文字加号还是表示1次或多次重复的regexp元字符?@EdMorton这是某个产品的名称,+
是名称的一部分,以说明它是更好的型号:)
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
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
awk -v test="$var" '$0~"\\<"test"\\>"' tfile
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
'