我试图从每行文字中显示第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
.�
.�
.�
任何人都知道为什么会这样?
答案 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,或者它取决于它是如何编译的。)