从文本文件中删除 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 后跟数字代码和 来编写 unicode 字符,例如Ctrl+Shift+u 0019 ⏎ 如果所有文本都用新行分隔,是否比使用&lt; path &gt; 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 方法的主要内容,如果未能解决你的问题,请参考以下文章

从特定字符开始删除所有文本

使用 sed 从文本文件中删除特定的行号?

使用 sed 删除多行字符串的简单方法

JavaScript 从字符串中删除零宽度空间(unicode 8203)

sed多行文本处理

使用 sed 从类似 XML 的文件中删除特定文本