我需要删除每行中以“of”开头的所有字符,如下所示:
Acer_BB1_Locus_1_Transcript_2of285068_Confidence_0.000_Length_1696
Acer_BB1_Locus_1_Transcript_2
答案1
假设输入是用户区域设置中的有效文本,您可以执行以下操作:
sed 's/of.*//' < input
替代品of
和任意数量*
的 ( )人物( ) 后面跟着空字符串.
(因此会在大多数实现中停止在不构成语言环境中有效字符的第一个字节处)。sed
如果您不能保证输入的编码与用户的区域设置相匹配,并且它不是其中某些字符的编码以(例如 BIG5²、BIG5-HKSCS、GBK、GB18030)o
结尾的字符编码之一o
),你可以这样做:
LC_ALL=C sed 's/of.*//' < input
作为非文本输入或使用与语言环境不同的字符映射编码的输入以及 GNU 实现的问题的示例sed
:
$ locale charmap
UTF-8
$ printf 'Point of St\351phane\n' | sed 's/of.*//'
Point �phane
$ printf 'Point of St\351phane\n' | LC_ALL=C sed 's/of.*//'
Point
(这里使用Stéphane
latin-1 或 latin-0 编码,通过在sed
具有 UTF-8 字符映射的语言环境中运行来处理,其中 0xe9 (0351) 单独不能构成有效字符的一部分)。
作为 BIG5-HKSCS 等字符编码问题的示例:
$ echo trèfle of concern | iconv -t BIG5-HKSCS | LC_ALL=C sed 's/of.*//'
tr�
$ echo trèfle of convern | iconv -t BIG5-HKSCS | LC_ALL=zh_HK.big5hkscs sed 's/of.*//' | iconv -f BIG5-HKSCS
trèfle
由于 U+00E8è
字符被编码为 0x88 0x6f,0x6f 也是 的编码o
。您需要sed
在使用该字符映射的语言环境中运行才能正确解码这些字符。
一些sed
实现也可能会失败,并出现输入无法解码的错误
² 你提到的宏碁是发明该字符集的五巨头之一。