
パターンと一致しない行を削除するためにこれを使用します。
$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5"
ただし、これを自動的に実行する必要があるため、次のように変数を設定しました。
$ catTMP=~/mpp/*.xml
私は次のようなものを実行したいと思います:
$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^__^Here^
既存の変数に基づいてリダイレクト名をどのように設定しますか?まだ理解していない場合は、私の言葉は次のとおりです。
$ cd ~/mpp/
$ ls
x.xml
$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2
$ ls
x.xml x.xml.2
または、その場で編集する方が良いかもしれませんが、grep
そうすることはできませんので、他のコマンドを使用してこれを行う方法があるかもしれません-i
。
答え1
パターンに一致する行だけを保持して、その場で編集します。
sed -n -r -i "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml
BSD sed
(Mac OSX)では、以下を試してください。
sed -n -E -i '' "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml
既存の変数に基づくファイル名
for fname in ~/mpp/*.xml
do
egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "$fname.2"
done
上記の方法は、変数名にピリオドが適していないために機能します。したがって、シェルは$fname.2
変数名があることを知っていますfname
。それ以外の場合は中括弧が必要です。たとえば、
for fname in ~/mpp/*.xml
do
egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "${fname}_2"
done
ここで中かっこは変数名であり、シェルにではないことをfname
示しますfname_2
。
答え2
使用awk
for x in `ls ~/map/*.xml`;do awk '/(pattern1|pattern2|pattern3|pattern4|pattern5)/{print}' $x > $x.2; done
forはすべてのxmlファイルとawk検索パターンを繰り返し、一致する場合は.xml.2に保存されます。
答え3
次のように使用できますgrep
。
for f in /dir/*glob*
do grep -E 'pattern|list' <<INFILE >"$f"
$(cat "$f")
INFILE
done
各ファイルのすべての末尾の空白行を削除しますが、私の前提は、空白行がユーザーの範囲にない可能性が$f
あることです。pattern|list