我已经用 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")'
也不起作用
最佳答案
首先 \s
是特定于 gnu-awk 的,非 gnu awk 不支持它。现在回到您的问题,您可以像这样使用空 RS(记录分隔符),并且您的正则表达式在这两种情况下都适用:
awk 'sub(/miz[[:space:]]/,"misspell")' RS='\0' file
注意 RS="\0'
,它将 RS
设置为空字节。
关于regex - 在正则表达式中表达超出 $ 的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512717/