나는 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]
이 아니어야 하는 문자와 일치합니다 .i
n
g
귀하의 질문을 "환호의 인스턴스를 전체 단어로 대체"로 바꾸면 단어 경계 표시를 사용하여 다음이 작동할 수 있습니다 \b
.
sed 's/\bcheer\b/lalaland/g'
답변2
이 표현식은 , 또는 를 제외한 [^ing]
모든 단일 문자를 나타냅니다. 따라서 일치하는(또는 일치하지 않는) 다른 문자가 없기 때문에 독립형 경우에는 일치하는 항목이 없습니다.i
n
g
cheer[^ing]
cheer
당신이 달성하고 싶은 것은부정적인 예측즉, 길이가 0인 어설션은 cheer
뒤에 오는 경우를 제외하고는 일치합니다.끈 ing
. 간단하지는 않지만 sed
구문을 사용하면 비교적 쉽습니다.perl
(?!ing)
perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree