我使用awk从文本文件中提取和评估数据。我想匹配一个有两个字符的字符串,即单个空格字符和一个换行符,如果'如果选中的字符串包含单个空格和换行符,则执行一些操作。
编辑::我仔细查看了数据,发现我想要匹配的字符串包含单个空格和换行符,这就是代码失败的原因。 我只打印该字符串变量并重定向到文件。
文件的二进制数据::
xxd -b stringvalue.txt
返回
00000000: 00100000 00001101
这个doestn工作::
if ( data[i] == '\s\n')
action
答案 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