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


14

たくさんの行があるファイルで、で始まる行を削除したいHERE IT IS

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


2
少し型破りですが、次のように使用できますvimvim '+g/^HERE IT IS/d' +wq test.txt;)
ドアノブ

@Doorknob、これを指摘してくれてありがとう。実際に私はVimを使用する私の方法で
micgeronimo

回答:


28

試してくださいsed

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

警告:次の-iスイッチを使用する場合は、バックアップを取ることをお勧めしますsed

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

元のファイルはそのまま残り<file>.bak、変更されたファイルはになります<file>


一致した文字列の後に改行文字を入れて改行に書き込むにはどうすればよいですか?
micgeronimo

2
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
heemayl

1
@micgeronimo:喜んでお手伝いします。編集内容を確認してください。
heemayl

6
@micgeronimoは、クリーンアップ/削除される可能性のあるコメントを通じてではなく、元の質問で本当に答えたい質問を尋ねようとします(編集できることを忘れないでください)。を使用できますsed '/^HERE IT IS/G' file
スチールドライバー

1
Sedの使い方はとてもプロです。
ラクシャアグ

18

あなたが受け取った非常に良い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 awkawkLinux のデフォルト)の新しいバージョン(4.1.1以降)もファイルをその場で編集できます:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • シェル(bashzshksh、おそらく他の人)。これは一種のばかげたことですが、実行できますが、他のツールの方が優れています。

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

1
あなただけを誇示しています!;-)(それはスマートだから、あなたは、upvoteを持って、私は多くのことを学んだし、bashLOL一つが私を作った)
Fabby

bashは使用する必要がありますprintf "%s\n" "$line":空白を保持するために$ lineを引用し、いくつかのエコーの問題を回避します(特殊な文字の解釈など)。追加する必要--もありません。
オリビエデュラック

@OlivierDulacまあまあ。私はフリンジ例のために物事を複雑にしたくなかったけどCuanglmが追加されましたので、IFS=-r私もすべての道を行くと、それは堅牢なことがあり、。
テルドン

@terdon:それはすべて良いことです^^(そして、初心者にとっては非常に有益なので、すでに+1をしました)
オリビエデュラック

2
@OlivierDulac UnixとLinuxに投稿する場合、printf、IFS =、-r、および引用符を使用したことを保証できます:)。コマンドラインに慣れていないことが多いAUオーディエンスの場合、物事を単純化します。
テルドン

13

grepそれらを除外するために使用します。例えば ​​:

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

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


賢い思考
アンワー

5

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オプションは、これがディレクトリに再帰しないことを意味します。


4

別のpythonオプション:

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

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


4

グレップ

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

のよう[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]に正規表現を使用できますが、のように効率的ではありませんstartswith[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]リストの出力をどのように生成しないのか疑問に思いました。
アビナッシュラジ

私がそれに最初に出会ったとき、それは私には奇妙に見えました。定義されたリスト内のすべてのアイテムに対して、印刷コマンド(または、それを使用したいアクション)を生成します。
ジェイコブVlijm

ただの楽しみのために、それを削除解除:)
ジェイコブVlijm

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.