sed 단어 경계는 콜론 문자와 함께 작동하지 않습니다

sed 단어 경계는 콜론 문자와 함께 작동하지 않습니다

다음 파일이 있습니다

> cat tmp
"aaa"
"aaa:xyz"

원하는 출력은

"bbb"
"aaa:xyz"

다음 sed 명령을 사용하고 있습니다

sed "s/\baaa\b/bbb/" tmp

하지만 이 명령을 사용하면

"bbb"
"bbb:xyz"

콜론 문자는 단어 경계로 취급되는 것 같습니다. 첫 번째 줄만 변경하고 두 번째 줄은 변경하지 않고 원하는 출력을 얻으려면 어떻게 해야 합니까? 나는 다음을 시도했지만 효과가 없었습니다

sed "s/\Baaa\B/bbb/" tmp
sed "s/\baaa\B/bbb/" tmp
sed "s/\Baaa\b/bbb/" tmp

편집: 아래와 같이 동일한 파일에 대해 다른 sed 명령을 사용해야 했습니다.

's/aaa:xyz/ttt/' tmp

따라서 콜론이 없는 경우에만 대체를 수행할 수 있습니다. 줄에 콜론이 있는지 여부에 관계없이 교체를 수행할 수 있어야 합니다.

답변1

GNU \b너비가 0인 단어 경계 모드는 단어 문자와 단어가 아닌 문자를 일치시킵니다. "단어 문자"는 일반적으로 영숫자 문자와 밑줄( _)입니다. 이는 \b문자열과 . 사이에 일치가 있음을 의미합니다.aaa:aaa:

다음은 \b모든 일치 항목을 다음으로 대체하여 샘플 문서에서 일치 항목이 발생하는 위치를 보여줍니다.\b*

$ sed 's/\b/*/g' file
"*aaa*"
"*aaa*:*xyz*"

모든 인스턴스를 "aaa"다음으로 바꾸 "bbb"려면

$ sed 's/"aaa"/"bbb"/g' file
"bbb"
"aaa:xyz"

모두 다 바꿔성격 aaabbb콜론을 포함하지 않는 모든 줄에 사용하세요.

$ sed '/:/!s/\baaa\b/bbb/g' file
"bbb"
"aaa:xyz"

aaa뒤에 콜론이 오지 않는 단어를 다음으로 바꾸려면 bbb:

$ sed -e 's/\baaa\([^:]\)/bbb\1/g' -e 's/\baaa$/bbb/' file
"bbb"
"aaa:xyz"

여기서 첫 번째 대체에 주목하세요.필요aaa하위 문자열을 나타냅니다 .다음에는 또 다른 캐릭터가 나옵니다. 이는 aaa줄 끝에 있는 하위 문자열이 대체되지 않음을 의미합니다. 이것이 바로 이 케이스에 대한 별도의 교체품을 마련한 이유입니다.

답변2

일치하지 않으면 :aaa를 bbb로 바꿉니다.

sed '/:/! s/aaa/bbb/g' test.txt 

펄 사용:

perl -pe 'if(!/:/){s/aaa/bbb/}' tmp

답변3

sed를 사용하세요:

sed 's/"aaa"/"bbb"/' file

산출:

"bb"
"아아아:xyz"

관련 정보