AWK模式匹配中转义双引号问题:如何避免匹配双引号?
解决awk正则误匹配双引号的问题
这个问题的核心是误解了awk正则字符组里的元字符处理规则,咱们一步步来修正:
问题根源
你之前的正则/["&+%\\|"]/里,双引号"被当作了字符组的一员,所以会误匹配双引号;同时在字符组内部,|本来就是字面量,根本不需要转义,你额外加的转义反而增加了不必要的复杂度。
修正后的代码
awk -F"|" 'NR == 2 { if (length($1) > 50) { print NR "\tDoes not meet length requirements" } if ($1 ~ /[&+%|]/) { # 移除了双引号,|直接作为字面量放在字符组里 print NR "\thas an invalid character" } }' Skruggle.csv
关键解释
- 字符组里的
|无需转义:在awk的正则字符组[]内部,除了^(开头时表取反)、-(表范围)、](结束字符组)这几个符号外,其他元字符(包括|、*、+)都会被当作普通字面量处理,直接写|就会匹配竖线本身。 - 移除双引号避免误匹配:把字符组里的
"去掉后,正则就只会匹配&、+、%、|这四个目标字符,不会再误匹配双引号了。 - 关于字段分隔符的
-F"|":这个写法是没问题的,shell会把双引号里的|当作字面量传递给awk,不需要额外转义。
如果之后需要在字符组里添加其他特殊字符,比如],可以把它放在字符组的最开头(比如[]&+%|]),或者用反斜杠转义([\]&+%|]);如果要添加-,放在字符组的开头或结尾即可。
内容的提问来源于stack exchange,提问作者BigBaby608
相关产品推荐
相关产品推荐

