1

大きなログ ファイルの特定の行にある少量のテキストを置き換えようとしています (合計で 4,000 万行)。

sed -i '20000000s/.\{5\}$/zzzzz/' log_file

これの目的は、後でテストするために、予想される一意の文字列で行を「マーク」することです。

上記のコマンドは正常に機能しますが、sed(およびperl) のインプレース編集では一時ファイルが作成され、コストがかかります。

一時ファイルや非常に大きなバッファを作成せずに、ファイル内の固定数の文字 (つまり、5 文字を他の 5 文字に置き換える) を置き換える方法はありますか?

4

2 に答える 2

3

ddいくつかのバイトを所定の位置に置き換えるために使用できます。

dd if=/dev/zero of=path/to/file bs=1 count=10 conv=notrunc skip=1000

1000sバイトの後に10個のゼロ(0x00)を書き込みます。置き換えたいものは何でもファイル内に入れて、そのパスをifパラメーターに書き込むことができます。次に、置換ファイルのサイズをcountパラメーターに挿入して、ファイル全体が読み取られるようにする必要がありました。

このconv=notruncパラメーターはdd、ファイルの終わりを切り捨てないままにするように指示します。

これは、1バイトのファイルエンコーディングでうまく機能するはずです。

于 2012-04-11T15:48:41.783 に答える
0

exスクリプト可能なファイル エディターなので、その場で動作します。

ex log_file << 'END_OF_COMMANDS'
20000000s/.\{5\}$/zzzzz/
w
q
END_OF_COMMANDS
于 2012-04-11T15:50:33.607 に答える