在 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") }'
结果:
- Linux:
2
2
- macOS、FreeBSD:
2
/usr/bin/awk: newline in string X
X... at source line 1
- Solaris:
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
考虑这些 awk
命令:
#!/bin/bash
awk 'BEGIN { print split("X\nX",a,"\n") }'
awk -v s=$'X\nX' 'BEGIN { print split(s,a,"\n") }'
结果:
- Linux:
2
2
- macOS、FreeBSD:
2
/usr/bin/awk: newline in string X
X... at source line 1
- Solaris:
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