是吗真的匹配任何角色?

问题描述 投票:10回答:3

我正在使用一个非常简单的sed脚本删除注释:sed -e 's/--.*$//'

它很有用,直到评论中出现非ascii字符,例如:-- °。此行与正则表达式不匹配,未替换。

知道如何让.真正匹配任何角色吗?


方案:

由于file说它是iso8859文本,在调用LANG之前必须更改sed变量环境:LANG=iso8859 sed -e 's/--.*//' -

sed ascii non-ascii-characters
3个回答
5
投票

这个对我有用。这可能是一个字符编码问题。

这可能有所帮助:


3
投票

@ julio-guerra:我遇到了类似的情况,试图删除如下的行(注意Æ字符):

--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

但这些都没有奏效。我找到了两个解决方法:

  1. 以下Perl表达式有效,即删除该行:

perl -pe 's/^--MP_.*$//g' my_file

[有关-pe命令行开关的说明,请参阅此StackOverflow答案:

Perl flags -pe, -pi, -p, -w, -d, -i, -t?]

  1. 或者,在将文件编码转换为UTF-8之后,sed表达式起作用(Æ字符仍然存在,但现在是UTF8编码的):

iconv -f iso-8859-1 -t utf-8 my_file > my_file.utf8

当我使用各种编码的大量(1000)电子邮件时,经过中间处理(bash脚本转换为UTF-8并不总是有效),为了我的目的,上面的“解决方案1”可能是最强大的解决方案。

笔记:

  • 和(GNU但是)4.4
  • 为x86_64-linux-thread-multi构建的perl v5.26.1
  • Arch Linux x86_64系统

0
投票

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'
© www.soinside.com 2019 - 2024. All rights reserved.