다음 파일이 있습니다
> 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"
모두 다 바꿔성격 aaa
bbb
콜론을 포함하지 않는 모든 줄에 사용하세요.
$ 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"