Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Unix shell脚本从平面文件中删除非英语字符和重音字符_Shell_Unix_Special Characters - Fatal编程技术网

使用Unix shell脚本从平面文件中删除非英语字符和重音字符

使用Unix shell脚本从平面文件中删除非英语字符和重音字符,shell,unix,special-characters,Shell,Unix,Special Characters,我有一个文件,其中包含很多重音字符和一些通配符(?,*)。如何在Unix中用空格替换这些字符(使用sed或类似实用程序)。我试着使用sed,但不知怎么的,它忽略了重音字符 谢谢如果您的重音字符是单字节的,您可以将tr与字符集一起使用来完成此操作。如果您可以确定要匹配的字符范围,那么这可能是最简单的: tr '\192-\255' ' ' < infile > outfile tr'\192-\255'outfile 如果您处理的是大于8位的字符,awk和sed可能可以处理它,但是

我有一个文件,其中包含很多重音字符和一些通配符(?,*)。如何在Unix中用空格替换这些字符(使用sed或类似实用程序)。我试着使用sed,但不知怎么的,它忽略了重音字符


谢谢

如果您的重音字符是单字节的,您可以将
tr
与字符集一起使用来完成此操作。如果您可以确定要匹配的字符范围,那么这可能是最简单的:

tr '\192-\255' ' ' < infile > outfile
tr'\192-\255'outfile

如果您处理的是大于8位的字符,awk和sed可能可以处理它,但是您需要确保您的输入被正确引用。尝试使用十进制或十六进制表示法,而不是字符本身。

这不是一个非常具体的答案,但它应该给你一些关键字来搜索

首先,简单一点。让
sed
匹配regexp字符很简单。例如:

% echo 'one tw? f*ur' | sed 's/\*/ /' 
one tw? f ur
% echo 'one tw? f*ur' | sed 's/[*?]/ /'
one tw  f*ur
%
处理非ASCII字符更麻烦

一些SED可以处理非ASCII字符,通常是unicode文件。有些SED不能。不幸的是,从sed的主页上可能看不出它是什么。生活是艰难的

您必须了解输入文件的编码方式。unicode文件将被编码为UTF-8或UTF-16中的一种或另一种(或者可能是几种不太常见的文件之一)。这里不是扩展unicode和编码的地方,但这些是扫描手册页的关键字

即使找不到可以处理unicode的sed,也可以使用perl、python或其他脚本语言进行处理——这些语言通常都有可以处理unicode的regexp引擎。perl
-n
选项创建了一个隐式循环,这可能会使您想要的转换成为一行


如果您的输入文档采用不同的(非unicode)编码,例如ISO-8859编码之一,那么我想最好的方法是使用类似于iconv的东西将其转换为UTF-8,然后从那里开始。

使用GNU
sed
,您可以执行以下操作:

sed 's/[^\o51-\o57\o64-\o89\o96-\o105\o112-\o121\o128-\o137\o144-\o145\o147\o150\o291-\o293]/ /g' inputfile

请注意,反斜杠后面的是字母“O”,而不是数字零。

您能显示不起作用的
sed
命令吗?我有一个需要保留在文件中的字符列表,所有其他字符都需要用空格替换。这会让生活变得更简单吗?是的,如果你处理的是8位字符,你也可以使用tr。只需使用互补集参数-C来反转字符集
tr-C“$keep_this_chars””outfile
。我尝试了以下方法来替换所有的字符,除了(A-Z、0-9和其他类似的字符!”#$%&'()+)
tr-C“\051-\057\064-\089\096-\0105\0112-\0121\0128-\0137\0144-\0145\0147\0150\0291-\0293”“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
其中所有数字都是字符的八进制值,例如范围无效?sed:-e表达式#1,字符91:无效范围end@codeObserver:哦,那是因为“9”不是有效的八进制数字。事实上,我不知道这些数字是从哪里来的,但这是原则。