我用一个很简单的sed脚本删除注释:sed -e 's/--.*$//'
是的。真的匹配任何角色?
,直到非ASCII字符出现在评论它的伟大工程,例如:-- °
。 该行与正则表达式不匹配,未被替换。
任何想法如何让.
真正匹配任何字符?
解决方案:
由于file
说,这是一个ISO8859的文本,LANG
环境变量必须在调用sed
之前可以更改: LANG=iso8859 sed -e 's/--.*//' -
我用一个很简单的sed脚本删除注释:sed -e 's/--.*$//'
是的。真的匹配任何角色?
,直到非ASCII字符出现在评论它的伟大工程,例如:-- °
。 该行与正则表达式不匹配,未被替换。
任何想法如何让.
真正匹配任何字符?
解决方案:
由于file
说,这是一个ISO8859的文本,LANG
环境变量必须在调用sed
之前可以更改: LANG=iso8859 sed -e 's/--.*//' -
@胡格拉:我遇到了类似的情况,试图删除线,如如下因素(注意Æ
字符) :
--MP_/yZa.b._zhqt9OhfqzaÆC
在一个文件中,使用
sed 's/^--MP_.*$//g' my_file
由Linux file
命令指示的文件编码为
file my_file: ISO-8859 text, with very long lines
file -b my_file: ISO-8859 text, with very long lines
file -bi my_file: text/plain; charset=iso-8859-1
我想你的解决方案,具有不同的排列(聪明!);例如,
LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file
但这些都不奏效。我发现了两种解决方法:
Perl
表达式工作,即删除的行:perl -pe 's/^--MP_.*$//g' my_file
[对于-pe
命令行开关的解释,请参见本StackOverflow的答案:
Perl flags -pe, -pi, -p, -w, -d, -i, -t?]
Æ
字符保留,但现在是UTF8编码):iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8
由于我用各种编码的电子邮件很多(1000年),经历中间处理(bash中,脚本转换为UTF-8并不总是工作),我的目的“的解决方案在1个工作“上面可能会是最强大的解决方案。
注:
的文档GNU sed的z
命令提到了这个效果(我强调):
该命令清空模式空间的内容。通常是 与's /.*//'相同,但效率更高,并且在输入流中存在无效多字节序列。 POSIX 要求这样的序列是而不是匹配'。',因此 没有可移植的方式来清除大多数多字节语言环境(包括UTF-8语言环境)中脚本的 中间的sed缓冲区。
您似乎可能正在以UTF-8(或其他多字节)语言环境运行sed。您需要设置LC_CTYPE
(这比LANG
更细致,并且不会影响错误消息的转换。有效区域设置名称通常看起来像en.iso88591
或(对于您的配置文件中的位置)fr_FR.iso88591
,而不仅仅是编码本身 - 你也许能看到locale -a
完整列表
例子:
LC_CTYPE=fr_FR.iso88591 sed -e 's/--.*//'
或者,如果您知道该行的非注释部分仅包含ASCII,你可能分裂。在评论标记上打印第一部分并丢弃其余部分:
sed -e 's/--/\n/' -e 'P' -e 'd'