首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用变量数据时如何在awk中使用单词边界

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

Stack Overflow用户
提问于 2015-02-24 19:56:46
回答 1查看 553关注 0票数 1

我对awk中的单词边界有问题

代码语言:javascript
复制
var="blue"
代码语言:javascript
复制
cat file
test
blue more
bluegrass not
yes red
more blue
fine blue, not

我只需要使用blue的行,或多或少。

如果我这样做了:

代码语言:javascript
复制
awk '/\<blue\>/' file
blue more
more blue
fine blue, not

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

但是如何用变量来实现这一点呢?

以下是我的一些测试:

代码语言:javascript
复制
awk '$0~"\<"test"\>"' test="$var" file
awk '$0~/\</test/\>/' test="$var" file
awk '{a="\<"test"\>"} $0~a' test="$var" file

所有这些都失败了。

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

更新。

我的一些变量似乎确实包含了一个+ sing。这阻止了Ed的解决方案

代码语言:javascript
复制
var="blue+"
代码语言:javascript
复制
cat file
test
blue+green more
bluegrass not
yes red
more blue+
fine blue+, not
代码语言:javascript
复制
awk -v test="$var" '$0~"\\<"test"\\>"' file
blue+green more
more blue+
fine blue+, not
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 20:00:10

代码语言:javascript
复制
awk -v test="$var" '$0~"\\<"test"\\>"' tfile

记住,在regexp上下文中使用的字符串会被解析两次,一次是在读取时,另一次是在执行时,所以如果需要转义,则需要对所有内容进行两次转义。

还请注意,\<是纯gawk的。

给定要搜索的文本可以包含所需的RE元字符的更新信息。

  1. 转义所有可能出现在文本中的RE元字符,或
  2. 把它当作字符串

如果你在特定的环境中只有几个人需要担心,而我相信你能弄清楚这一点,那么逃避RE元元就很简单了,但是很难(不可能?)一般来说,由于字符的上下文敏感性质,所以我将重点讨论如何检测不是较长的“word”的一部分的字符串:

代码语言:javascript
复制
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
'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28705084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档