我用awk尝试了以下测试:
例:
如果我有一个文件:
miz[space][space][end-of-line]
[empty line]
pel
如果我这样做:
$ cat mul.txt |awk 'sub(/miz\s+/,"misspell")'
misspell
awk找到了模式。
但是,如果我从第一行删除2个空格:
miz[end-of-line]
[empty line]
pel
我明白了:
$ cat mul.txt |awk 'sub(/miz\s+/,"misspell")'
即。 awk不匹配。
似乎$
和\s
之间存在一些我无法理解的微妙之处。
此外,我似乎无法找到一种表达正则表达式的方法,该正则表达式包含超出$
的匹配但第一个代码段正常工作。
有人可以解释这里的问题是什么?
更新
这个:$ cat mul.txt |awk 'sub(/miz(\s+|$|^$|^\s+$)+pel/,"misspell")'
不起作用
答案 0 :(得分:2)
首先\s
是gnu-awk特定的而非gnu awk不支持它。现在回到你的问题,你可以使用这样的空RS(记录分隔符),你的正则表达式将适用于这两种情况:
awk 'sub(/miz[[:space:]]/,"misspell")' RS='\0' file
注意RS="\0'
将RS
设置为空字节。
答案 1 :(得分:0)
使用此正则表达式,以便它可以处理空格和行尾:
/miz([ ]+|\n)/