既存の変数に基づいてファイル名を指定する方法は?

既存の変数に基づいてファイル名を指定する方法は?

パターンと一致しない行を削除するためにこれを使用します。

$ 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

おすすめ記事