ファイルから特定の行を削除したいです。 20-37行と45行があるとしましょう。この行の内容を指定せずにどうすればよいですか?
答え1
を使用すると、sed
次のようになります。
sed '20,37d; 45d' < input.txt > output.txt
この作業を現場で行うには、次の手順を実行します。
sed --in-place '20,37d; 45d' file.txt
答え2
ファイルがメモリに収まる場合は、使用することもできますed
。
このコマンドは上記のコマンドと非常によく似ており、sed
そのうちの1つです。重要な違い:削除する行番号/範囲のリストを降順(最も高い行番号/範囲から最も低い行番号/範囲まで)に渡す必要があります。これは、行の削除/挿入/分割/接続を使用するときにed
各サブコマンドの後にテキストバッファが更新されるため、一部の行を削除すると、次の行の残りの部分が同じバッファ位置になくなったためです。次のサブコマンドを実行します。だから最初から始めるべきです。
所定の位置に編集する:
ed -s in_file <<IN
45d
20,37d
w
q
IN
または
ed -s in_file <<< $'45d\n20,37d\nw\nq\n'
または
printf '%s\n' 45d 20,37d w q | ed -s in_file
結果の出力をファイルに書き込む代わりに印刷するには、w
rite を rint に置き換えます。,p
元のファイルをそのまま残して別のファイルに書き込む場合は、新しいファイル名をw
rite サブコマンドに渡すことができます。
ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN
1各選択後に新しい行番号を計算したくない場合は、d
この場合は非常に簡単です(20〜37行の削除、つまり18行以降の45行が27行になります)。以下を実行できます。
ed -s in_file <<IN
20,37d
27d
w
q
IN
ただし、複数行番号/範囲を削除する必要がある場合は、逆に作業することをお勧めします。
答え3
ただメモリに読み込んで変更して書き直すだけです。次のようなことができます
filename = "foo"
f = open(filename, 'r+')
linenums = [1, 3]
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()
テストには5行のファイルを使用してください。感謝の言葉http://pleac.sourceforge.net/pleac_python/fileaccess.html、「一時ファイルなしでファイルを変更する」を参照してください。また、見ることができますhttps://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python
いくつかの注意:
上記のように最初にファイルを書き、次に切り取るのではなく、最初にファイルを切り取って書き込むことができます。しかし、私は読み取りを許可してから書き込みを切り捨てるPythonフラグを知りません。しかし、文書が明確ではないので、何かが欠けている可能性があります。これは思います。
時にはPythonのドキュメントは本当に悪いです。バラより http://docs.python.org/library/functions.html#open
「r+」、「w+」、および「a+」モードは更新用にファイルを開きます(「w+」はファイルを切り捨てます)。
これはあなたにどんな意味がありますか? 「公開アップデート」とはまさに何ですか?
Unixy(ストリームエディタなど)よりもPythonでこれを行う方が良いかもしれません。携帯性が良いかもしれませんが、sedがどれほど携帯性が良いかわかりません。私は古典的なUnixツールよりも低レベルのプログラミングに慣れているので、この記事を書いています。必要に応じて正確に実行しても大丈夫ですが(私の考えでは)一般的にそれほど柔軟ではありません。
この方法(メモリのファイル操作)は、メモリをディスク領域に交換します。最大数百 Mb のファイルに対して数 Gb のメモリを持つシステムで実行する必要があります。 Pythonは文字列を非常に効率的に処理しないため、C / C ++に切り替えるとパフォーマンスがわずかに向上し、メモリ使用量が大幅に削減されます。
答え4
ExモードでVimを使用できます。
ex -sc '20,37d|45d|x' file
d
削除x
保存して閉じる