sed를 사용하여 단어, 문자 또는 줄 끝 사이의 일치 항목을 바꿉니다.

sed를 사용하여 단어, 문자 또는 줄 끝 사이의 일치 항목을 바꿉니다.

사이의 모든 것을 일치논평:다음;또는줄 끝그리고 그것을 단어로 바꾸세요.술집

s="/home/user/14.JPG;comment:foo;sometag;sort:30"
sed "s/comment:(\w+)/\bar/g" <<< $s

상품을 반품하다

/home/user/14.JPG;comment:foo;sometag;sort:30

바꾸다

/home/user/14.JPG;comment:bar;sometag;sort:30

내가 뭘 잘못했나요?

답변1

먼저 ERE(확장 정규 표현식)를 사용하려고 하지만 Sed는 기본적으로 BRE(기본 정규 표현식)를 사용합니다. 즉, ()그룹화 및 +"하나 이상"의 경우 ERE입니다. 자세한 내용은 읽어보십시오.내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?. ERE를 활성화하려면 이 -E플래그를 사용하세요(그러나 우리 솔루션에서는 필요하지 않습니다).

comment:(\w+)너도 어울리 니까 그것만으로는 부족하지만

  • 다시 소개할 필요는 없습니다 comment:. 교체 슬롯에 넣으십시오.
  • \wGNU 확장 으로질문에서 주장하는 것처럼 "모든 것이 다음으로 이동합니다" (\w+)가 아닌 단어 문자를 일치시킵니다 .;[^;]*

해결책은

sed 's/comment:[^;]*/comment:bar/g'

답변2

그룹을 사용하고 마비를 통해 통화할 수 있습니다. 그룹화하여 yyy를 xxx로 바꿉니다.

$ echo "foo yyy bar" | sed 's/\(foo\).*\( bar\)/\1 xxx \2/'  
foo xxx bar

귀하의 경우:

sed "s/\(comment:\).*\(sometag\)/\1bar\2/g" <<< $s

관련 정보