web-dev-qa-db-ja.com

パターンに一致する行を見つけて削除する方法は?

多くの行があるファイルで、HERE IT ISで始まる行を削除します。

コマンドラインツールのみを使用してこれを行うにはどうすればよいですか?

13
micgeronimo

sedを試してください:

sed -i '/^HERE IT IS/d' <file>

警告:sed-iスイッチを使用する場合は、バックアップを取る方が適切です:

sed -i.bak '/^HERE IT IS/d' <file>

元のファイルは<file>.bakのままで、変更されたファイルは<file>のままです。

28
heemayl

受け取った非常に優れたgrepsedの回答に加えて、同じことを行うことができる他のツールがいくつかあります。

  • Perlのいくつかの方法:

    Perl -ne '/^HERE IT IS/ || print' file > newfile
    Perl -ne 'print if !/^HERE IT IS/' file > newfile
    Perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    -iスイッチを任意の例に追加して、ファイルをその場で編集できます。

    Perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (g)awk

    awk '!/^HERE IT IS/' file > newfile
    

    GNU awk(Linuxではデフォルトのawk)の新しいバージョン(4.1.1以降)もファイルをその場で編集できます。

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • シェル(bashzshksh、おそらくその他)。これはちょっと馬鹿げていますが、canできますが、他のツールの方が優れています。

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    
16
terdon

grepを使用してそれらを除外します。例えば ​​:

grep -v "^HERE IT IS" infile > outfile

次に、outfileをinfileに戻します。

13
Ben Hills

sedは間違いなく道です。

コマンド@heemaylのこのわずかな変更は、パターン参照のIが原因で、同じケースがパターンで使用されているかどうかにかかわらず、行を削除します。

sed -i '/HERE IT IS/Id' <file>

これを実行したいディレクトリに複数のファイルがある場合は、そのようなファイルをfindと組み合わせることができます。

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

Maxdepthオプションは、これがディレクトリに再帰しないことを意味します。

5
Arronical

Grep

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS)負の先読みアサーション。正規表現エンジンがすべての行開始境界に一致するようにします(これは通常^と一致します)後に文字列HERE IT ISが続かない場合のみ

python

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

スクリプトをファイルに保存し、script.pyと言ってから、ターミナルで以下のコマンドを実行します。

python3 script.py infile
4
Avinash Raj

別のpythonオプション:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

ここで、fは引用符で囲まれたファイルへのパスです。

4
Jacob Vlijm

ExモードでVimを使用できます。

ex -sc 'g/^HERE IT IS/d' -cx file
  1. gグローバル検索

  2. d delete

  3. x保存して閉じる

1
Steven Penny