18

特定のパターンに一致する行をfile1からfile2に移動したい。Windows で、あるファイルから別のファイルへのカット アンド ペーストの操作に似ています。

file1barを含むすべての行を切り取り、新しく作成したfile2に貼り付けたいとしましょう

入力:

ファイル1

bla foo bla
bla bar bla
bla aaa bla
bla bar bla
bla foo bla

処理後の望ましい出力:

ファイル1

bla foo bla
bla aaa bla
bla foo bla

ファイル2

bla bar bla
bla bar bla

私が試したこと

grep必要なfile2を作成しますが、 file1は変更しません

grep 'bar' file1 > file2

sed -i目的のファイル 1 を変更しますが、ファイル 2は作成しません

sed -i '/bar/d' file1

両方のコマンドを次々に実行すると、望ましい結果が得られます。しかし、ここでは、好奇心からスクリプトをより簡潔にするために、 1 行のコマンドを探しています。

あなたの助けをいただければ幸いです。

4

5 に答える 5

17

これはうまくいくかもしれません(GNU sed):

sed -i -e '/bar/{w file2' -e 'd}' file1

別の方法:

sed -i -e '/bar/w file2' -e '//d' file1

file2 に追加するには、一時ファイルに書き込み、cat を使用して bash スクリプトのファイルの末尾に追加するか、次を使用します。

sed -i -e '/bar/w tmpfile' -e '$e cat tmpfile >> file2 && rm tmpfile' -e '//d' file1

注: 最後の解決策では、一度に 1 つの入力ファイルのみを変更できます。

于 2013-10-19T20:30:11.340 に答える
5

を使用して、印刷時に正規表現の一致に基づいて別のファイルハンドルを選択できます。

perl -i.bak -ne 'BEGIN { open $oh, q|>|, pop or die } { print { m/bar/ ? $oh : q|ARGVOUT| } $_ }' file1 file2

次の結果が得られます。

==> file1 <==
bla foo bla
bla aaa bla
bla foo bla

==> file2 <==
bla bar bla
bla bar bla
于 2013-10-19T10:59:06.027 に答える
1

&&2 つのコマンドの間に a を挿入して、1 行にすることができます。しかし、それでは読みにくくなるため、お勧めしません。

1つのコマンドで同じことを行うには、ファイルをその場で編集し、不要な行を削除すると同時にそれらの行を出力するstdoutstderr、他のファイルにリダイレクトできるものが必要です。たぶんedこれでできますが、書き方がわかりません。これを行う「標準」の UNIX ツールは他にないと思います。

ところで、カット&ペーストには実際には3つのステップがあります:

  1. 選択したテキストをクリップボードにコピー
  2. 元のファイルから削除
  3. クリップボードから新しいファイルに貼り付け

2 ステップの UNIX コマンドは、クリップボードなしで実行します。

于 2013-10-19T10:53:01.440 に答える