匹配单个空间与换行内部'如果'在AWK

时间:2017-09-08 07:41:32

标签: bash awk character special-characters newline

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

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

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

00000000: 00100000 00001101 

这个doestn工作::

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

2 个答案:

答案 0 :(得分:0)

选择@ 123的评论作为解决方案。现在为什么:除非data [i]包含1个空格,否则你的第1个和第2个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, " ")

答案 1 :(得分:0)

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

要确定字符串是否是单个空格,我们使用相等==,test:

$ 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