したがって、アイデアは、ファイルの$ SCL変数を使用してnas_...
一致するパターンを置き換えますが、置き換えてはならない2つの正確な一致を除外することです。nas_$SCL
nas_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
その場所から変更するには、次のオプションを追加するだけです(-i
GNUを使用する場合は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
(これはあなたの順序を仮定します。する一致が単語文字で構成されることを望みます。それ以外の場合は変更できます。