0

非常に単純な質問(と思います)

でファイルを編集することを学んでいますawk

ファイルからすべてのライナーを検索し、アセテートという単語を含むすべての行を削除したい

私が試してみました

awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.txt

ただし、これは空の txt ファイルを返します。

なにか提案を?

4

5 に答える 5

9

これをやってみてください:

awk '!/acetate/{print}' filename.txt > new_filename.txt &&
mv new_filename.txt filename.txt

または単に:

awk '!/acetate/' filename.txt > new_filename.txt &&
mv new_filename.txt filename.txt

を使用して、ファイルの印刷と変更を同時に行うことはできませんawk。同じコマンドで実行したい場合は、を使用してみてください:

sed -i '/acetate/d' filename.txt

または Mac Os X の場合:

sed -i.'' '/acetate/d' filename.txt
于 2013-01-30T23:05:56.213 に答える
3

UNIX を使用しているようです。これを行う場合:

command file > file

ここで、「コマンド」は任意の UNIX コマンドです。「コマンド ファイル」によって読み取られる前に、「ファイル」が「> ファイル」によって上書きされる危険性があるため、絶対に行わないでください。

「sed」などの一部のツールには、「インプレース」編集を可能にするオプションがあり、入力ファイルでそのコマンドを実行した結果がそのファイルに書き戻されます。それらのほとんどは、舞台裏で一時ファイルを使用しています。

コマンドの結果をファイルに書き戻す安全でポータブルな方法は、出力を tmp ファイルにリダイレクトしてから、一時ファイルを元のファイルに移動することです。

command file > tmp && mv tmp file

安全で、シンプルで、どんなコマンドでも機能します。

特定の単語を含まないファイル内の行を探すという特定のケースでは、おそらく必要なコマンドは「grep」であり、次のように使用します。

grep -v acetate filename.txt > tmp && mv tmp filename.txt

より複雑なものについては、おそらく awk が必要になるでしょう。

于 2013-01-31T01:22:19.077 に答える
2

sputnick は比較的完全な回答を提供しています。grep の方法を追加します。

grep -v 'acetate' file > newfile
于 2013-01-30T23:33:47.450 に答える
2
perl -pi -e 'if(/acetate/){undef $_}' your_file

これにより、インプレース置換が行われます。つまり、ファイル内の文字列 'acetate' を含む行が自動的に削除されます。または、次のこともできます。

perl -pi -e 'undef $_ if /acetate/' your_file

また

sed -i.bak '/acetate/d' temp
于 2013-01-31T09:28:07.933 に答える