【问题标题】:Remove Unicode characters from textfiles - sed , other Bash/shell methods从文本文件中删除 Unicode 字符 - sed ,其他 Bash/shell 方法
【发布时间】: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

【问题讨论】:

  • 你的文本文件是什么编码的?

标签: bash unicode sed text-files spaces


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 2018-09-03
    • 2016-06-19
    • 2018-11-09
    • 1970-01-01
    • 2018-06-15
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多