【发布时间】:2011-03-01 09:57:40
【问题描述】:
我有一个文件,其中包含许多重音符号和一些通配符 (?, *) 字符。如何在 Unix 中用空格替换这些字符(使用 sed 或类似实用程序)。我使用 sed 尝试过,但不知何故它忽略了重音字符。
谢谢
【问题讨论】:
-
你能显示无效的
sed命令吗?
标签: shell unix special-characters
我有一个文件,其中包含许多重音符号和一些通配符 (?, *) 字符。如何在 Unix 中用空格替换这些字符(使用 sed 或类似实用程序)。我使用 sed 尝试过,但不知何故它忽略了重音字符。
谢谢
【问题讨论】:
sed 命令吗?
标签: shell unix special-characters
使用 GNU sed,您可以执行以下操作:
sed 's/[^\o51-\o57\o64-\o89\o96-\o105\o112-\o121\o128-\o137\o144-\o145\o147\o150\o291-\o293]/ /g' inputfile
请注意,反斜杠后面是字母“O”而不是数字零。
【讨论】:
这不是一个非常具体的答案,但它应该为您提供一些搜索关键字。
首先,简单一点。让sed 匹配正则表达式字符很简单。例如:
% echo 'one tw? f*ur' | sed 's/\*/ /'
one tw? f ur
% echo 'one tw? f*ur' | sed 's/[*?]/ /'
one tw f*ur
%
处理非 ASCII 字符比较麻烦。
一些 seds 可以处理非 ASCII 字符,通常是 unicode 文件。有些seds不能。不幸的是,从您的 sed 的联机帮助页中可能并不明显。生活很艰难。
您必须弄清楚输入文件的编码是什么。一个 unicode 文件将编码为 UTF-8 或 UTF-16 中的一种(或者可能是一种几个不太常见的)。这不是扩展 unicode 和编码的地方,但这些是扫描手册页的关键字......
即使您找不到可以处理 unicode 的 sed,您也可以使用 perl、python 或其他一些脚本语言来进行处理——这些通常具有可以处理 unicode 的正则表达式引擎。 perl -n 选项会创建一个隐式循环,这可能会使转换成为您想要的单线。
如果您的输入文档采用不同的(非 unicode)编码,例如 ISO-8859 编码之一,那么我猜最好的办法是使用类似的东西将其转换为 UTF-8 iconv,然后从那里继续。
【讨论】:
如果您的重音字符是单字节的,您可以使用带有字符集的tr 来完成此操作。如果您可以确定要匹配的字符范围,那可能是最简单的:
tr '\192-\255' ' ' < infile > outfile
如果您要处理大于 8 位的字符,awk 和 sed 可能会处理它,但您需要确保正确引用您的输入。尝试使用十进制或十六进制表示,而不是字符本身。
【讨论】:
tr -C "$keep_these_chars" ' ' < infile > outfile.
tr -c "\051-\057\064-\089\096-\0105\0112-\0121\0128-\0137\0144-\0145\0147\0150\0291-\0293" "" < testme.txt > out.log 但我得到了错误:* *tr: `4-\000' 的范围端点是反向整理顺序**
tr -c "\012\015\041\042\043\044\045\046\047\050\051\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\135\140\173\174\175" ' ' < $file > tmpfile.txt 其中所有数字都是字符的八进制值