在 awk 中拆分包含换行符的外部变量的便携式方法?

Portable way to split an external variable containing newlines in awk?

考虑这些 awk 命令:

#!/bin/bash
awk 'BEGIN { print split("X\nX",a,"\n") }'
awk -v s=$'X\nX' 'BEGIN { print split(s,a,"\n") }'

结果:

2
2
2
/usr/bin/awk: newline in string X
X... at source line 1
2
/usr/xpg4/bin/awk: file "(null)": line 1: Newline in string
  Context is:
>>>     X
>>>             <<<

有没有办法解决这个问题?


编辑:

甚至不需要使用外部变量,以下在所有 awk 实现中也会失败,但 GNU 实现:

awk 'BEGIN { s = "X\nX"; print split(s,a,"\n") }'

POSIX awk 不允许在字符串值中使用物理换行符.

当您使用 C/BASH 字符串表示法时 $'a\nb' 那么任何 POSIX 兼容的 awk 实现都会失败。

即使使用 gnu-awk,当您启用 posix 选项时,也会返回以下错误:

awk --posix -v s=$'X\nX' 'BEGIN { print split(s,a,"\n") }'
awk: fatal: POSIX does not allow physical newlines in string values

但是,如果您删除 $'...' 符号,则不会出现错误:

awk --posix -v s="X\nX" 'BEGIN { print split(s,a,"\n") }'
2