在 OSX 中使用 awk 转义反斜杠

在 OSX 中使用 awk 转义反斜杠

我正在尝试匹配 csv 文件字段中的 \N 。

我试过了

awk -F "|" '($12=="\N") {print}' ./filename.csv
awk -F "|" '($12==\N) {print}' ./filename.csv
awk -F "|" '($12==\\N) {print}' ./filename.csv
awk -F "|" '($12==\\\\N) {print}' ./filename.csv

到目前为止没有任何效果

答案1

在类似 Bourne(如bash)、类似 Csh 或类似 rc 的 shell 中,使用:

awk -F'|' '$12 == "\\N"'

在 awk 字符串中,反斜杠用于引入类似 C 的转义序列,例如\b退格键、\n换行符、\123八进制序列……您需要\\反斜杠本身。目前,在我所知道的\N任何实现中,其本身都不是已知的转义序列。awk

有些awk实现会将"\N"as视为\N,有些作为N,有些 (gawk) likeN并发出警告消息。 POSIX 未指定行为。

请注意,它也适用于传递的字符串,例如:

awk -F'|' -v value='\\N' '$12 == value'

或者:

awk -F'|' '$12 == value' value='\\N'

您可能希望使用环境按原样传递值,而不必担心转义特殊字符awk( 并避免 GNU awk4.2 或更高版本的问题,这处理以特殊开头@/和结尾的值/):

VALUE='\N' awk -F'|' '$12 == ENVIRON["VALUE"]'

它也适用于正则表达式文字,如下/.../所示:

awk -F'|' '$12 ~ /\\N/'

然而,由于反斜杠作为转义序列引入符(for \n, \b...)和正则表达式的引用运算符(\.\$... 以删除其正则表达式运算符的特殊含义)而被重载,因此情况变得更加复杂。 POSIX 目前在一些极端情况下(例如 on/\\.//\56/)尚不清楚(甚至在某些情况下与现实不符)/[\135]/。再次使用ENVIRON会有所帮助,但并不总是如此。例如:

R='[\]' awk '$0 ~ ENVIRON["R"]'

旨在匹配 POSIX 中的反斜杠,但awk在我知道的所有实现中返回错误。如果从字面上理解的话,为了安全起见,最好总是逃避\内部的偶数。[...]

请注意,对于fishshell,您需要另一层转义,因为 for fish(与大多数其他 shell 相反)\在单引号内是特殊的。所以你需要:

awk -F'|' '$12 == "\\\\N"'

那里。尽管

awk -F'|' '$12 == "\\\N"'

也会起作用。

env 'V=\N' awk -F'|' '$12 == ENVIRON["V"}'

也应该工作(在fish和其他 shell 系列中)。

相关内容