リストから複数のパターンに一致する文字列を削除する

リストから複数のパターンに一致する文字列を削除する

次の行を含むファイルがあります。

1
apple
2
orange
3
banana
4
mango
5
coconut

パターンのリストがあります。

1
3
5

次のようにするために、パターンリストを使用してこの行(およびそれ以降の行)を削除したいと思います。

2
orange
4
mango

1つのコマンドで毎日手動で入力できないパターンが多いため、リストを使用する必要があります。

答え1

sed+生地解決策:

sed -E "/\<(`paste -s -d'|' patterns`)\>/{N;d;}" file

出力:

2
orange
4
mango

  • paste -s -d'|' patterns- 正規表現シフトグループを取得するために区切り文字patternsとして使用されるファイル行を結合します。|(1|3|5)

  • N- パターン空間に次の行を追加します。

  • d- パターン空間の行削除

答え2

いくつかのオプションジャグリングをしましょうgrep

grepリストファイルの行を除いて、フルーツファイルのすべての行でこれを行うことができ、数値は除外されます。

grep -v -x -f numbers fruits

-f与えられたパターンファイル、-x部分一致、および-v逆一致防止)

残念ながら、数字と果物は別の行にあるので、果物はgrepで生き残ります。これを削除するために追加のパターンを試してみましょう-e

grep -v -x -e "[a-z]*" -f numbers fruits

これで、文字だけで構成されたすべての行が削除されるため、もはや果物がなく、希望の果物もありません。ただし、コンテキストから回復できます。

grep -v -x -A1 -e "[a-z]*" -f numbers fruits

-A1各試合後に追加ラインを提供)最終的に欲しいものを提供します。

答え3

この試み。

pattern_fileすべてのpatternsコンテンツと残りのコンテンツが含まれていますfile_content。ここでは、grepパターンマッチング後の行数に応じて変更されるオプションを試しました。-A 1

#!/bin/bash

while read pattern 
do
        for line_num in `grep $pattern file_content -A 1 -n | awk -F":|-" '{print $1}' | paste -sd ","`
        do
                sed -i "${line_num}d" file_content
        done
done < pattern_file

関連情報