web-dev-qa-db-ja.com

シェルで特定のパターンを持つ行の後にある行を削除します

私はすべての行を削除しようとしていますが、ファイルの特定のパターンの後に来ます。

私は多くのファイルを持っています、それらはすべて同じ構造を持っています:

例:

file1

line 1
...
line x "here there is a specific pattern"
...
EOF

ファイルn

line 1
...
line x "here there is a specific pattern"
...
EOF

私は簡単な解決策を得ようとしましたが、多くのファイルがあるので、私は長い道のりを進みます:p

パターンは各ファイルに1回表示されます。

したがって、このパターンを含むすべての行番号を取得し、1つのファイルに保存します。

これは私のコードです:

count=$(ls -f path_to_folder/*.txt | wc -l)
echo "Number of txt file : $count"
###


    for ((i=1;i < $count+1 ;i++))

    {

    vt=$(grep -n PATTERN $i.txt | cut -d : -f 1)
    echo $vt >> PATTERN_line.txt

    }

PATTERN_line.txtのすべての行には、パターンが存在する各ファイルの行番号が含まれます。

今、私はそれらの番号を使用して、パターンの後にファイルの最後に来るすべての行を削除しようとしています。

これは、ファイルを先頭からパッテン行まで含める必要があることを意味します。

私はあなたの助けに感謝します

5
MGM

これは、テキスト処理ユーティリティでは非常に簡単です。たとえば、sedを使用する場合:

sed '1,/pattern/!d' file

つまり、最初の行からpatternを持つ行まですべての行を一致させ、一致しない行をすべて削除します。したがって、patternをパターンに置き換えます。 /が含まれている場合、それらの文字をエスケープする必要があります。たとえば、パターンがpattern-with/characterの場合:

sed '1,/pattern-with\/character/!d' file

(編集されたストリームを標準出力に出力するのではなく)実際にファイルを編集するには、-iフラグを使用できます。

sed -i '1,/pattern/!d' file

古いファイルの拡張子を-iに追加することにより、元のファイルのバックアップを作成できます。ここで注意してください-拡張の前にスペースを入れないでください。

sed -i.backup '1,/pattern/!d' file

sedは複数のファイル名引数を取ります。たとえば、現在のディレクトリ内のすべての非表示でないファイルを操作するには、次を使用できます。

sed -i '1,/pattern/!d' *
10
Zanna

@Zannaありがとう

私はこの解決策を見つけました:

for ((i=1;i < $count+1 ;i++)) 

sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt

ありがとうございました

0
MGM

このシェルスクリプトを試してください。入力として2つの引数を取ります。最初の引数は入力ファイル名です。 2番目の引数は、検索に必要なパターンです。パターンが初めて一致した後、行を削除します。

#!/bin/bash

touch temp.txt

while read line
do
    echo "$line" | grep "$2" &> /dev/null
    if [ $? -eq 0 ]
    then
        echo "$line" >> temp.txt
        mv temp.txt $1
        echo "STATUS: Pattern matched. Successful operation..."
        exit 0
    fi
    echo "$line" >> temp.txt
done < $1

echo "STATUS: Pattern not found. No lines are deleted..."
rm -f temp.txt
0
Ranajit Hore

Awkを使用した別のソリューション:

awk '/specific-pattern/{stop=1} stop==0{print}' < input_file >> output_file

変数stopは0(デフォルト)ですが、awkは現在の行を出力します。ただし、現在の行が 正規表現 /specific-pattern /に一致する場合、stopは1に設定されます。これにより、stop==0が偽になり、awkは実行されなくなりますprintステートメント。

入力はinput_fileから読み取られ、output_fileに追加されます。

パターンの行を保持したい場合は、awkスクリプトの2つの部分を逆にします。

0
user234461