从文本文件中删除 Unicode 字符 - sed ,其他 Bash/shell 方法
Posted
技术标签:
【中文标题】从文本文件中删除 Unicode 字符 - sed ,其他 Bash/shell 方法【英文标题】:Remove Unicode characters from textfiles - sed , other Bash/shell methods 【发布时间】:2012-01-23 15:26:53 【问题描述】:如何从终端中的一堆文本文件中删除 Unicode 字符?
我试过了,但是没用:
sed 'g/\u'U+200E'//' -i *.txt
我需要从文本文件中删除这些 Unicode 字符:
U+0091 - sort of weird "control" space
U+0092 - same sort of weird "control" space
A0 - non-space break
U+200E - left to right mark
【问题讨论】:
你的文本文件是什么编码的? 【参考方案1】:清除file.txt
的所有非ASCII字符:
$ iconv -c -f utf-8 -t ascii file.txt
$ strings file.txt
【讨论】:
我想保留 unicode 编码。抱歉,所以 iconv 不是解决方案。 为什么不能反向运行呢? tempf=$(mktemp) iconv -c -f utf-8 -t ascii file.txt > $tempf iconv -f ascii -t utf-8 $tempf > file.txt UTF-8 是 ASCII 的有效子集。反向转换保持文件不变。 你刚刚改变了我的生活,凯夫!你是男人。谢谢! 这是给我的。用这种废话打破了我的自动化。现在它又可以工作了!【参考方案2】:如果您想删除 仅 个特定字符并且您拥有 Python,则可以:
CHARS=$(python -c 'print u"\u0091\u0092\u00a0\u200E".encode("utf8")')
sed 's/['"$CHARS"']//g' < /tmp/utf8_input.txt > /tmp/ascii_output.txt
【讨论】:
也许不是最漂亮的。但这对我来说效果很好。通过构造 CHARS 变量,使 sed 更易于阅读,并且 CHARS 变量可以轻松维护。 Choroba 的答案也有效,所以我想这是一个品味问题(如果你手边有 Python)。 是python部分的替代代码python -c 'print "".join(map(unichr, range(0x80, 0xa0) + range(0x2000, 0x200f))).encode("utf-8")'
在最近的 linux 操作系统中,您可以通过按 Ctrl+Shift+u 后跟数字代码和 Ctrl+Shift+u 0019 ⏎
< path > newpath
更快?有一个庞大的文件,为什么我问..
kev 对 Chobra 的回答的评论是我发现最有用的。您可以用这个答案插入它以获得CHARS=$(echo -ne '\u200c')
,然后是相同的sed
行。【参考方案3】:
对于 Unicode 的 UTF-8 编码,您可以将这个正则表达式用于 sed:
sed 's/\xc2\x91\|\xc2\x92\|\xc2\xa0\|\xe2\x80\x8e//g'
【讨论】:
我如何找到从U+...
到\xc2\...
的映射?
该 |在 sed 中这种方式对我不起作用,所以我不得不将一系列带有单个替换的 sed 命令串在一起。
@JonathanW。是不是缺少了/g
?
这里的系统之间有很多差异。 MacOS 不支持 \xNN 代码,并且 RHEL 需要使用 -r 选项才能使 sed 能够使用它们。只是要记住一些事情,以防您在一个系统上开发脚本并部署到另一个系统(通常不是最好的主意,但这永远不会阻止人们这样做):)【参考方案4】:
使用iconv:
iconv -f utf8 -t ascii//TRANSLIT < /tmp/utf8_input.txt > /tmp/ascii_output.txt
这会将像“Š”这样的字符翻译成“S”(最相似的字符)。
【讨论】:
它们不是 ascii,我想将它们保留在 utf8 中,但我想将这些奇怪的空格替换为普通的空字符串""
不是 OP 想要的,但我需要将 unicode 行分隔符 (u2028) 转换为换行符。我更喜欢使用 iconv,但我不知道该怎么做。有办法吗?
-c 标志可用于丢弃无法音译的字符,从而避免致命错误。
作为 -c 的替代方案,--unicode-subst 允许指定替换字符的模式,而不是完全删除它。例如,--unicode-subst='?'允许用问号替换不可识别的字符。
@ChrisQuenelle - 几年过去了,但你有没有解决过你的问题?我有同样的问题。【参考方案5】:
将 Swift 文件从 UTF-8 转换为 ASCII:
for file in *.swift; do
iconv -f utf-8 -t ascii "$file" > "$file".tmp
mv -f "$file".tmp "$file"
done
Swift auto completion not working in Xcode 6 Beta
【讨论】:
以上是关于从文本文件中删除 Unicode 字符 - sed ,其他 Bash/shell 方法的主要内容,如果未能解决你的问题,请参考以下文章