【问题标题】:Simple whitespace check in AWK regex not workingAWK 正则表达式中的简单空格检查不起作用
【发布时间】:2017-01-20 16:40:50
【问题描述】:

我有一个 AWK 脚本,它逐行遍历文件,并根据找到的内容执行各种操作,一切正常。最近发现有些行需要忽略,都遵循格式

        FOO_.....

所以我需要匹配空格FOO_。还有一些我不想匹配的行

        BAR_...  FOO_...

所以匹配需要是行首。这一切都应该很容易,我很快就设置好了

if($0 ~ /^\s*FOO_/)
{
    continue;
}

不幸的是,上述方法不起作用。我尝试了很多检查,直到我终于能够让它工作

if($0 ~ /^ *\t*FOO_/)
{
    continue;
}

因此,由于某种原因,\s* 无法正确匹配空格,但*\t*(一个或多个空格,一个或多个制表符)确实有效。第二个工作意味着匹配的所有内容要么是空格要么是制表符,它们都应该包含在\s 下,所以我真的不确定为什么\s 不起作用。

我可以让它与其他选项一起使用,但它并不理想,我只是好奇可能导致此问题的原因。

【问题讨论】:

    标签: regex awk


    【解决方案1】:

    \s 是 POSIX 字符类 [[:space:]] 的简写,仅在某些 awks 中有效。听起来您使用的 awk 不是其中之一。

    【讨论】:

    • 我本可以发誓我们还有其他使用\s 的 awk 脚本,但我可能只是在想不同的正则表达式,而这些正则表达式没有在 awk 中完成。这很可能是问题所在。
    • 如果不是,那么除了您在问题中向我们展示的内容之外,您的输入数据或脚本还有其他问题。如果这确实回答了您的问题,请参阅stackoverflow.com/help/someone-answers。你真的应该切换到gawk,顺便说一句,然后\s 不仅可以工作,而且你会获得大量非常有用的附加功能。
    • 我最近在使用默认 awk 时遇到了这个问题,解决方案是安装 GNU awk (apt install gawk)。
    【解决方案2】:

    假设您使用的是默认字段分隔符,您可以通过检查第一个单词是否以 FOO_ 开头来避免此问题

    if ($1 ~ /^FOO_/) {...}
    

    【讨论】:

    • 谢谢,我不太确定我为什么不这样做,脚本中的其他部分使用 $0 因为他们检查前几个单词,我想我刚刚得到不加思索地以同样的方式做事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多