알려지지 않은 단어 2는 변경하지 않고 문자열의 알려진 단어 1과 3을 변경합니다.

알려지지 않은 단어 2는 변경하지 않고 문자열의 알려진 단어 1과 3을 변경합니다.

Word1 Word2 Word3텍스트 파일이 있는데 텍스트 파일의 모든 인스턴스를 찾아 Word4 Word2 Word5.Word2는 알 수 없는 문자열이지만 나머지 단어는 알려져 있습니다.

내가 지금까지 시도한 것은 다음과 같습니다.

문자열이 있는데 (...) foobarfoo (...)이를 다음으로 바꾸고 싶습니다.(...) hatbarcar (...)

sed -i 's/foo.*foo/hat.*car/g' data.txt

하지만 내가 얻은 결과는

(...) hat.*car (...)

따라서 와일드카드는 내가 원하는 단어 문자열을 찾는 것이지만 동일한 와일드카드를 사용하여 이전 문자열을 대체하는 문자열을 작성하고 싶습니다.

이것이 가능합니까/누구든지 제안이 있습니까?

답변1

문제는

sed -i 's/foo\(.*\)foo/hat\1car/g'

접근 방식은 욕심 이 많은 fooxfoo fooyfooas 로 변경하는 것입니다 .hatxfoo fooycar.*

perl대신 탐욕스럽지 않은 연산자를 사용할 수 있습니다 .*?.

perl -i -pe 's/foo(.*?)foo/hat$1car/g'

(이것은 이식성이 더 높다는 장점도 있습니다. -i많은 구현에서 제공되지만 perl많은 구현에서 사용할 수는 없습니다 sed(사용 가능하더라도 모든 사람이 같은 방식으로 해석하는 것은 아닙니다).

환경이 아닌 GNU를 사용하면 다음을 수행할 수 sed있습니다 .$POSIXLY_CORRECT

sed -i 's/foo/\n/g;s/\n\([^\n]*\)\n/hat\1car/g;s/\n/foo/g'

즉, foo욕심없는 동등성을 달성하는 데 사용할 수 있도록 줄에 나타날 수 없는 문자(줄 구분 기호)로 바꾸십시오.\n[^\n]*

환경에 POSIXLY_CORRECT가 있는 경우 [^\n]POSIX를 제외한 모든 문자가 일치하며 개행을 제외한 문자는 일치 \하지 않습니다 . n언제든지 다음과 같이 할 수 있습니다.

(unset -v POSIXLY_CORRECT; exec sed...)

POSIXLY_CORRECT가 설정된 환경에서 스크립트가 계속 작동하기를 원하는 경우.

답변2

의 대체 문자열 s/PATTERN/REPLACEMENT/은 정규식이 아닙니다.

너는 할 수있을 것이다포착원하는 경우 교체에 사용할 수 있는 패턴의 포인트와 일치하는 것:

sed -r 's/foo(.*)foo/hat\1car/g' file

foo이렇게 하면 같은 줄에서 두 번 발생하는 내용을 캡처하고 hat와 사이에 비트를 삽입합니다 car. \1"첫 번째 괄호에 캡처된 내용을 삽입하세요"라고 표시됩니다 .

이는 .*"탐욕적"이므로 가 있는 경우 foobarfoofoobarfoo가 아닌 가 \1됩니다 .barfoofoobarbar

답변3

sed를 사용하면 교체의 교체 부분에서 참조 할 수 있는 캡처링 그룹을 사용 \(하고 \)생성 할 수 있습니다 .\1

 sed 's/foo\(.*\)foo/hat\1car/g'

관련 정보