パターンを削除する必要がある非常に大きなファイルがあります。問題は、ファイルに改行文字がないことです。削除するパターンは次のとおりです。... 1666 more items
ここで、1666は任意の数字にすることができます。
答え1
sed
これが最高のツールかどうかはわかりません。個人的に私はperl
そのようなものを見つけて、次のような結論を下しました。
perl -pe 'BEGIN{ $/ = " more items"; } s/\.\.\.\s\d+ more items$//;'
-e
実行するプログラムのテキストです。
-p
プログラムテキストの暗黙的なループが各レコードに対して一度実行されることを意味します(デフォルトでは、1つのレコードは1行です。以下の修正を参照)。
$/
まず、デフォルトの改行()のレコード区切り文字を「more items」文字列に設定します。これは\n
、マークされたブロックBEGIN { }
の先頭で一度行われます。
レコード区切り文字まで(および含む)一度に1チャンクずつ入力を読み込みます。したがって、各ループの入力バッファには「とにかく…1234個の追加項目」があるようになります。
これはs/\.\.\.\s\d+ more items$//
、3つの点(「すべての文字」の特別な意味を削除するためにエスケープされています)、スペース(\ s)、1つ以上の数字(\d+
)、および「追加項目」テキストで構成される文字列を削除するための置換です。録音終了($
)。記録の終わりを一致させる必要はありませんが、一致速度を上げることができます。
このオプションはデフォルトで結果を印刷します-p
。
答え2
GNU sed(時々とも呼ばれるgsed
)を使用すると、長い行がメモリ制限に達する可能性があります。
MacOSやBSDなど他のsedを使用する場合には制限があります。これGNU sed マニュアル説明する:
移植可能な sed スクリプトを作成する場合、一部の実装では、行の長さ (パターンおよび予約スペース) を 4000 バイト以下に制限することが知られています。 POSIX標準は、準拠したsed実装が少なくとも8192バイトの行長をサポートする必要があることを指定します。 GNU sed には行の長さにデフォルトの制限はありません。より多くの(仮想)メモリをmalloc()できる限り、必要に応じて行を提供または設定できます。
したがって、GNU sedがある場合は、提案されているようなsedソリューションを使用できます。@フィリップス:
sed 's/\.\.\. [0-9]* more items//g'
awkを使う
あるいは、GNU awk(時々呼び出されるgawk
)がある場合は、次のことを試してください。
awk -v RS='\.\.\. [0-9]* more items' 1 ORS="" File
したがって、正規表現を次\.\.\. [0-9]* more items
のように使用してください。記録区切り記号入力および空の文字列について記録区切り記号出力について。これは正規表現に一致する項目を削除する効果があります\.\.\. [0-9]* more items
。
awkは一度に1つのレコードのみを読み取るため、sedソリューションよりもメモリを消費しにくい。