따라서 아이디어는 파일의 $SCL 변수를 사용하여 nas_...
일치하는 패턴을 바꾸되 대체되어서는 안 되는 2개의 정확한 일치 항목을 제외하는 것입니다.nas_$SCL
nas_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
해당 위치에서 변경하려면 다음 옵션을 추가하기만 하면 됩니다 ( -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
(이것은 귀하의 순서를 가정합니다.하다일치 항목이 단어 문자로 구성되기를 원합니다. 그렇지 않은 경우 수정할 수 있습니다.