sed:一致するパターンから複数の部分文字列を除外します。

sed:一致するパターンから複数の部分文字列を除外します。

したがって、アイデアは、ファイルの$ SCL変数を使用してnas_...一致するパターンを置き換えますが、置き換えてはならない2つの正確な一致を除外することです。nas_$SCLnas_mba && nas_tvr

これまで、私のコードはこれら2つの一致を除外しますが、他の望ましくない一致も妨げています。

sed -i "s/nas_[^mt][^bv][^ar]/nas_$SCL/gI" filename.xml

正確に一致する2つの項目のみを除外するにはどうすればよいですか?

修正する:これまで、次の解決策を見つけました。

sed -i "/(nas_mba|nas_tvr)/! s/nas_.../nas_$SCL/"

ただし、一致するものがある場合は、行全体をスキップします。

答え1

私はこれをします:

sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'

例:

echo "nas_mba
nas_tvr
nas_foo" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_mba
nas_tvr
nas_bar

元のテキストのみnas_fooが変更され、nas_mbaすべてnas_tvr変更されません。

行がより多くの別の例:

echo "nas_hat
> nas_mba
> nas_foo
> nas_hat
> nat_tvr
> nas_cat
> nas_dog" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

その場所から変更するには、次のオプションを追加するだけです(-iGNUを使用する場合はsed必要ありません。-i ""追加するだけで-i十分です)。

sed -E -i "" '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/' nas.txt 
cat nas.txt 
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

Mac OS X 10.11.6およびBSDでテストされていますsed

答え2

Perlがオプションの場合は、次のものを使用できます。視野:

export SCL
perl -pe 's/nas_(?!mba|tvr)\w*/nas_$ENV{SCL}/g' file

(これはあなたの順序を仮定します。する一致が単語文字で構成されることを望みます。それ以外の場合は変更できます。

関連情報