sed는 일부 문자 정규식만 대체합니다.

sed는 일부 문자 정규식만 대체합니다.

나는 sed와 정규식을 연습하고 있고 아래 파일에서 "cheer"의 모든 인스턴스를 lalaland로 바꾸려고 노력 중입니다. 단, 응원과 같은 것은 제외하세요.

ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
cheerytree
acheerytree

ubuntu@ip-172-31-58-40:~$ sed -i "s/cheer[^ing]/lalaland/g" test
ubuntu@ip-172-31-58-40:~$ cat te
cat: te: No such file or directory
ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
lalalandtree
alalalandtree

왜 첫 번째 항목 "Cheers"가 빠졌는지 이해가 되지 않습니다.

감사해요

답변1

이 패턴은 여러분이 생각하는 것과는 다릅니다. 즉 , 또는 [^ing]이 아니어야 하는 문자와 일치합니다 .ing

귀하의 질문을 "환호의 인스턴스를 전체 단어로 대체"로 바꾸면 단어 경계 표시를 사용하여 다음이 작동할 수 있습니다 \b.

sed 's/\bcheer\b/lalaland/g'

답변2

이 표현식은 , 또는 를 제외한 [^ing]모든 단일 문자를 나타냅니다. 따라서 일치하는(또는 일치하지 않는) 다른 문자가 없기 때문에 독립형 경우에는 일치하는 항목이 없습니다.ingcheer[^ing]cheer

당신이 달성하고 싶은 것은부정적인 예측즉, 길이가 0인 어설션은 cheer뒤에 오는 경우를 제외하고는 일치합니다. ing. 간단하지는 않지만 sed구문을 사용하면 비교적 쉽습니다.perl(?!ing)

perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree

바라보다앞으로 및 뒤로 길이가 0인 어설션

관련 정보