sed: 일치하는 패턴에서 여러 부분 문자열을 제외합니다.

sed: 일치하는 패턴에서 여러 부분 문자열을 제외합니다.

따라서 아이디어는 파일의 $SCL 변수를 사용하여 nas_...일치하는 패턴을 바꾸되 대체되어서는 안 되는 2개의 정확한 일치 항목을 제외하는 것입니다.nas_$SCLnas_mba && nas_tvr

지금까지 내 코드는 이 두 일치 항목을 제외하지만 다른 원치 않는 일치 항목도 방해합니다.

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

(이것은 귀하의 순서를 가정합니다.하다일치 항목이 단어 문자로 구성되기를 원합니다. 그렇지 않은 경우 수정할 수 있습니다.

관련 정보