テキストファイルから特定の文字列で始まる各行のすべての文字を削除する方法は?

テキストファイルから特定の文字列で始まる各行のすべての文字を削除する方法は?

次のように、各行で「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

入力したエンコーディングがユーザーのロケールと一致することを保証できず、一部の文字のエンコードが終わる文字oエンコーディング(BIG5²、BIG5-HKSCS、GBK、GB18030など)の1つではない場合は、次のことが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エンコーディングの使用は、sedUTF-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もエンコードですosedこれらの文字を正しくデコードするには、この文字マップを使用するロケールで実行する必要があります。


一部sedの実装では、入力をデコードできないというエラーによって失敗する可能性があります。

²あなたが言及したAcerは、この文字セットを発明した5大企業の1つです。

おすすめ記事