【问题标题】:Matching single space with newline inside 'if' in AWK在 AWK 中将单个空格与“if”内的换行符匹配
【发布时间】:2017-09-08 07:41:31
【问题描述】:

我正在使用 awk 从文本文件中提取和评估数据。我想匹配一个有两个字符的字符串,即'if'中的单个空格字符和一个换行符,如果检查的字符串包含单个空格和一个换行符,则执行一些操作。

EDIT :: 我仔细查看了数据,发现我想要匹配的字符串包含单个空格和一个换行符,这就是代码失败的原因。 我只打印那个字符串变量并重定向到一个文件。

文件的二进制数据:: xxd -b stringvalue.txt返回

00000000: 00100000 00001101 

这不起作用::

if ( data[i] == '\s\n')
      action 

【问题讨论】:

  • 使用索引而不是==,即if (index(data[i]," ")
  • if [[ data[i] == *" "* ]]
  • @pikand 这不是 awk...
  • edit 向我们展示minimal reproducible example 的问题,包括简洁、可测试的样本输入和预期输出以及您迄今为止尝试过的内容,以便我们为您提供帮助。如果不清楚,请参阅How to Ask

标签: bash awk character special-characters newline


【解决方案1】:

选择@123 的评论作为解决方案。现在解释为什么:除非 data[i] 恰好包含 1 个空格,否则您的第一个和第二个 if 将不匹配。第三个无论如何都不匹配,因为“\s”在您的示例中被解释为字符串,而不是正则表达式。

因此,您需要一个空间索引或一个正则表达式检查。

拿这个脚本:

$ cat tst.awk
$0~" " { print "'" $0 "' matches \" \""}
/\s/{ print "'" $0 "' matches /\\s/" }
index($0, " "){ print "'" $0 "' matches index(\$0, \" \")" }
{ if ($0 == " ") print "'" $0 "' exactly matches space" }

并使用以下方法对其进行测试:

$ echo ' ' | awk -f tst.awk
' ' matches " "
' ' matches /\s/
' ' matches index($0, " ")
' ' exactly matches space

和:

$ echo ' abc ' | awk -f tst.awk
' abc ' matches " "
' abc ' matches /\s/
' abc ' matches index($0, " ")

【讨论】:

    【解决方案2】:

    测试字符串是否为单个空格

    要确定一个字符串是否为单个空格,我们使用等式,==,测试:

    $ awk 'BEGIN{data[1]="a"; if (data[1] == " ") print "Found space"}'
    $ awk 'BEGIN{data[1]="a "; if (data[1] == " ") print "Found space"}'
    $ awk 'BEGIN{data[1]=" "; if (data[1] == " ") print "Found space"}'
    Found space
    

    测试一个字符串是否至少有一个空格

    要查找字符串是否包含空格,请使用data[i] ~ / /。这将检查 data[i] 是否匹配包含单个空格的正则表达式。

    例子:

    $ awk 'BEGIN{data[1]="abc"; if (data[1] ~ / /) print "Found space"}'
    $ awk 'BEGIN{data[1]="a c"; if (data[1] ~ / /) print "Found space"}'
    Found space
    

    测试一个字符串是否只有一个空格

    如果data[i] ~ / / 为真,则字符串data[i] 至少有一个空格。

    如果data[i] ~ / .* / 为真,则字符串data[i] 至少有两个空格。

    要确定data[i] 是否只有一个空格,我们结合这些测试:data[i] ~ / / && !( data[i] ~ / .* / ) 其中! 是 awk 的逻辑非。例如:

    $ awk 'BEGIN{data[1]="a c "; if (data[1] ~ / / && !( data[1] ~ / .* / )) print "Found space"}'
    $ awk 'BEGIN{data[1]="a cd"; if (data[1] ~ / / && !( data[1] ~ / .* / )) print "Found space"}'
    Found space
    

    【讨论】:

    • 此代码在包含空格的字符串中查找空格。我的所有字符串至少包含一个空格。但是有些字符串只有一个空格。我想找出那些只有一个字符的字符串,即单个空格。
    • @jonny789 在你的问题中给出匹配/不匹配字符串的例子。
    • @jonny789 “我想找出那些只有一个字符的字符串,即单个空格。”我刚刚更新了答案以包含它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2011-12-18
    • 2019-09-02
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多