次の行を含むファイルがあります。
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