我有一个必须处理数百万条记录的 awk 脚本,但我需要删除任何包含多字节字符的记录。
在我工作的环境中,以下简化的 shell 序列完全满足我的要求:
firstval=$'\x1c'
lastval=$'\xFF'
regex="[^${firstval}-${lastval}]"
awk -v REGEX="${regex}" '{if ($0 !~ REGEX){print $0}}' myfile
但是,在我的笔记本电脑上,我得到了致命错误:“无效的正则表达式:无效的排序字符:/[^-�]/”
这感觉像是语言环境问题,并且已验证我的机器和它工作的机器是相同的:
sh-4.2$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
我遗漏了什么?我需要调整什么才能在我自己的机器上获得相同的行为?
答案1
我也会尝试设置 LC_ALL。它在您的语言环境输出中似乎为空。
LC_ALL=en_US.UTF-8
如果仍然无法使多字节字符集起作用,请尝试使用 POSIX 运行 AWK,看看是否有效。
awk -W posix -v REGEX="${regex}" '{if ($0 !~ REGEX){print $0}}' myfile