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 fooyfoo
as 로 변경하는 것입니다 .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
됩니다 .barfoofoobar
bar
답변3
sed를 사용하면 교체의 교체 부분에서 참조 할 수 있는 캡처링 그룹을 사용 \(
하고 \)
생성 할 수 있습니다 .\1
sed 's/foo\(.*\)foo/hat\1car/g'