Bash Cut钻石问号符号�

时间:2016-02-24 12:58:08

标签: bash cut

我试图从每行文字中显示第2和第7个字符。

while read line
do
  x=`echo $line | cut -c2,7`
  echo $x
done

示例输入:

C.B - Cantonment Board/Cantonment    
C.M.C – City Municipal Council    
C.T – Census Town    
E.O – Estate Office

预期产出:

.C
.â
.“
.“

我的输出:

.C
.�
.�
.�

任何人都知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

cut并不真正支持Unicode。您可能希望改为使用Perl(改编自this Unix & Linux post):

perl -CIO -ne 'print substr($_, 1, 1) . substr($_, 6, 1) . "\n"'

例如:

$ perl -CIO -ne 'print substr($_, 1, 1) . substr($_, 6, 1) . "\n"' < foo
.C
.â
.“
.“

-CIO告诉perl输入和输出都是Unicode。 substr(var, m, n)从索引n开始提取长度为m的子字符串(从0开始)。所以第二个字符是索引1处长度为1的子字符串。$_是保存当前输入行的变量。

答案 1 :(得分:1)

您可以使用bash的子字符串参数扩展。

while read line; do
    x=${line:1:1}${line:6:1}  # 0-based counting
    echo "$x"
done <<EOF
C.B - Cantonment Board/Cantonment
C.M.C – City Municipal Council
C.T – Census Town
E.O – Estate Office
EOF

表单${var:offset:length}会在length的值offset位置返回var个字符。字符串是0索引的,就像数组一样。

(我不确定,如果bash 总是正确处理utf-8,或者它取决于它是如何编译的。)