이것은 sed를 사용하여 다중 문자 문자열을 욕심없이 일치시키는 방법입니다. 당신이 모든을 변경하고 싶은 말은하자 foo...bar
에 <foo...bar>
너무 예를 들어이 입력 :
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
이 출력이되어야합니다 :
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
그렇게하려면 foo와 bar를 개별 문자로 변환 한 다음 그 문자의 부정을 사용하십시오.
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
위 :
s/@/@A/g; s/{/@B/g; s/}/@C/g
인 변환 {
하고 }
그 다음 문자 변환 가능하므로 자리 문자열에 그 입력에 존재할 수 foo
및bar
것이다.
s/foo/{/g; s/bar/}/g
변환된다 foo
및 bar
에 {
그리고 }
각각
s/{[^{}]*}/<&>/g
변환 - 우리가 원하는 연산을 수행 foo...bar
에<foo...bar>
s/}/bar/g; s/{/foo/g
변환된다 {
하고 }
다시 foo
와 bar
.
s/@C/}/g; s/@B/{/g; s/@A/@/g
자리 표시 자 문자열을 원래 문자로 다시 변환합니다.
위의 단계는 첫 번째 단계에서 이러한 문자열을 제조 할 때 입력에 존재하지 않는 특정 문자열에 의존하지 않으며 {[^{}]*}
필요한만큼 여러 번 사용할 수 있기 때문에 일치하는 특정 정규 표현식의 발생을 신경 쓰지 않습니다. 표현식에서 원하는 실제 일치 및 / 또는 seds 숫자 일치 연산자를 분리합니다 (예 : 두 번째 항목 만 대체).
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV