String awk&xE5äö;umlaut字符的长度为2
我使用awk(MacOSX)只打印n个字符或更长的行 如果我在如下所示的文本文件(strings.txt)上尝试:String awk&xE5äö;umlaut字符的长度为2,string,macos,awk,diacritics,String,Macos,Awk,Diacritics,我使用awk(MacOSX)只打印n个字符或更长的行 如果我在如下所示的文本文件(strings.txt)上尝试: four foo bar föö bår fo ba fö bå 我运行这个awk脚本: awk ' { if( length($0) >= 3 ) print $0 } ' <strings.txt (最后两行不应打印)。似乎包含umlaut字符(å,ä,ö…)的单词可以算作两个字符 (输入文件以UTF8格式保存。)尝试设置您的区域设置: LC_ALL=en_U
four
foo
bar
föö
bår
fo
ba
fö
bå
我运行这个awk脚本:
awk ' { if( length($0) >= 3 ) print $0 } ' <strings.txt
(最后两行不应打印)。似乎包含umlaut字符(å,ä,ö…)的单词可以算作两个字符
(输入文件以UTF8格式保存。)尝试设置您的区域设置:
LC_ALL=en_US.UTF-8 awk 'length >= 3' infile
将en_US.UTF-8更改为正确的语言环境。尝试以下操作:
$ echo "four
foo
bar
föö
bår
fo
ba
fö
bå
"|awk ' {x=$0;gsub(/./,"x",x); if( length(x) >= 3 ) print $0 } '
输出
four
foo
bar
föö
bår
BSD
awk
(又称BWKawk
)预装在macOS上(从macOS 10.13开始仍然有效),不幸的是,不支持Unicode编码。
您的选择是:
- 如果您知道所涉及的字符适合单字节编码如ISO-8859-1,您可以使用
,如下所示:iconv
iconv -f UTF-8 -t ISO-8859-1 file | awk 'length >= 3' | iconv -f ISO-8859-1 -t UTF-8
- 安装另一个支持Unicode的
实现,例如awk
(GNU awk)或gawk
;e、 例如,通过:mawk
brew信息窗口
brew信息mawk
- 使用支持Unicode的不同预装工具,例如
:sed
sed -n '/^.\{3,\}/p' file
awk
是否支持Unicode。如果正则表达式上下文中的
与非ASCII字符匹配,则意味着长度
也会将其识别为单个字符,替换它没有意义。我是新手,请耐心等待。在再次运行awk之前如何设置区域设置?我试过“LC_ALL=en_US.UTF-8”,但它不起作用……你应该使用:LC_ALL=en_US.UTF-8 awk…
或export LC_ALL=en_US.UTF-8;awk…
。我使用了第一个选项LC\u ALL=en\u US.UTF-8 awk。。。。但是,我的脚本找不到unicode字符串txt,比如字符串“Name”…不知道如何解决这个问题…在我的回答中,我指的是GNU awk,您使用的是哪种awk实现?@Odinodin:切换到gawk
本身就足够了-不需要LC\u ALL
欺骗,只要您的语言环境是基于UTF8的(它应该在OSX上)。
sed -n '/^.\{3,\}/p' file