如何删除文本文件中以特定字符串开头的每一行中的所有字符?

如何删除文本文件中以特定字符串开头的每一行中的所有字符?

我需要删除每行中以“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éphanelatin-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实现也可能会失败,并出现输入无法解码的错误

² 你提到的宏碁是发明该字符集的五巨头之一。

相关内容