私はすべての行を削除しようとしていますが、ファイルの特定のパターンの後に来ます。
私は多くのファイルを持っています、それらはすべて同じ構造を持っています:
例:
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
のすべての行には、パターンが存在する各ファイルの行番号が含まれます。
今、私はそれらの番号を使用して、パターンの後にファイルの最後に来るすべての行を削除しようとしています。
これは、ファイルを先頭からパッテン行まで含める必要があることを意味します。
私はあなたの助けに感謝します
これは、テキスト処理ユーティリティでは非常に簡単です。たとえば、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' *
@Zannaありがとう
私はこの解決策を見つけました:
for ((i=1;i < $count+1 ;i++))
sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt
ありがとうございました
このシェルスクリプトを試してください。入力として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
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つの部分を逆にします。