繁体   English   中英

Sed 使用 UTF8 输入

[英]Sed with UTF8 input

我需要帮助才能上学。 我有(当然是来自 stackoverflow)这个将字符串的第一个字符大写的脚本。

sed -r "s/(^|\.\s+)./\U&/g" <$temp_file_2

但是其中的 output 是 ANSI 编码或者那是什么。 file -bi 显示 unknown-8bit 编码格式。

utf-8中的output报备有什么变化吗?

PS:这条sed命令是用来把行首字符大写的。 (支持特殊的斯洛伐克字符,如 ščťžýáíéď 等) PS:文件必须为 UTF-8,因为内容已插入 mysql 数据库。 转换文件导致信息丢失。

问题是sed可能无法处理非 ASCII 字符,尤其是当系统区域设置不是 UTF8 时。

$ bash -c "echo 'abc,ščťžýáíéď' | LANG= LC_CTYPE= sed -E --debug 's/./\U&/g'"
SED PROGRAM:
  s/./\U&/g
INPUT:   'STDIN' line 1
PATTERN: abc,\o37777777705\o37777777641\o37777777704\o37777777615\o37777777705\o37777777645\o37777777705\o37777777676\o37777777703\o37777777675\o37777777703\o37777777641\o37777777703\o37777777655\o37777777703\o37777777651\o37777777704\o37777777617
COMMAND: s/./\U&/g
MATCHED REGEX REGISTERS
  regex[0] = 0-1 'a'
PATTERN: ABC,\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777\o37777777777
END-OF-CYCLE:
ABC,

如您所见, sed将每个非 ASCII 字符视为几个单独的字节,因此它错误地将它们大写。 一种解决方案是将LANGLC_CTYPE设置为 UTF8 兼容的语言环境。

$ bash -c "echo 'abc,ščťžýáíéď' | LANG=C.UTF8 LC_CTYPE=C.UTF8 sed -E --debug 's/./\U&/g'"
SED PROGRAM:
  s/./\U&/g
INPUT:   'STDIN' line 1
PATTERN: abc,\o37777777705\o37777777641\o37777777704\o37777777615\o37777777705\o37777777645\o37777777705\o37777777676\o37777777703\o37777777675\o37777777703\o37777777641\o37777777703\o37777777655\o37777777703\o37777777651\o37777777704\o37777777617
COMMAND: s/./\U&/g
MATCHED REGEX REGISTERS
  regex[0] = 0-1 'a'
PATTERN: ABC,\o37777777705\o37777777640\o37777777704\o37777777614\o37777777705\o37777777644\o37777777705\o37777777675\o37777777703\o37777777635\o37777777703\o37777777601\o37777777703\o37777777615\o37777777703\o37777777611\o37777777704\o37777777616
END-OF-CYCLE:
ABC,ŠČŤŽÝÁÍÉĎ

参考:

尝试这个

  cat <src> | iconv -f <srcenc> | sed .... | iconv -t <targetenc> > target

要查看编​​码列表:

  iconv -l

要查看您是否猜测输入文件的编码正确,请检查

cat <src> | iconv -f <srcenc> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM