Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String awk&xE5äö;umlaut字符的长度为2_String_Macos_Awk_Diacritics - Fatal编程技术网

String awk&xE5äö;umlaut字符的长度为2

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

我使用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_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
(又称BWK
awk
)预装在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
    实现
    ,例如
    gawk
    (GNU awk)或
    mawk
    ;e、 例如,通过:
    • brew信息窗口
    • brew信息mawk
  • 使用支持Unicode的不同预装工具,例如
    sed

    sed -n '/^.\{3,\}/p' file
    

那么问题是:awk(特别是长度)是否支持Unicode?哈哈,这是一个不错的解决方案!谢谢。这本质上是一个无操作,不会解决问题-您的
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