여러 단어 정규 표현식의 sed 대체 문제

여러 단어 정규 표현식의 sed 대체 문제

간단한 예를 들어보세요:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/\2 ts=\"\1\">\3/'

다음을 반환합니다:

<?xml version=1.0?><Haystack ts="20150310 21:12:01.846338"><Event

본질적으로 나는 줄의 처음 24자를 가져와 이를 루트 요소의 xml 특성으로 삽입하고 나머지 xml을 바꾸고 싶습니다. 이것은 작동합니다.

하지만 이를 전치하면 Haystack\|Foo원래 Foo\|Haystack문자열만 반환되고 일치하는 항목을 찾을 수 없습니다. 실제로 찾아야 할 루트 요소가 약 7개 있습니다.

하지만 \|다음과 같이 일치시킬 여러 단어를 입력하는 방법은 다음과 같습니다.

echo "foo" | sed 's/foo\|bar/nobar/'

그렇다면 () 참조 일치가 위와 같은 방식으로 작동하도록 하려면 어떻게 해야 할까요?

저는 Fedora Linux, sed 버전 4.2.2를 사용하고 있습니다.

또한 누구든지 보다 효율적인 정규식을 제안해 주시면 감사하겠습니다. 이것은 내가 찾고 있고 가능한 한 빨리 실행하는 데 필요한 약 7개의 루트 XML 표현식을 포함하는 더 큰 문제 세트의 일부입니다.

답변1

sed당신의 표현은 다음 중 하나와 일치한다고 알려줍니다 .<?xml.*><Haystack 또는 Foo. 정규식 엔진은 캡처링 괄호를 사용하여 연산자를 왼쪽이나 오른쪽으로 확장할 정도를 알려줍니다 or. (PCRE 엔진을 사용하는 경우 비캡처 괄호를 사용할 수 있습니다.)


문제가 있는 원본 코드:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/\2 ts=\"\1\">\3/'

고정 코드:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*>\)<\(Haystack\|Foo\)>\(.*\)/\2<\3 ts=\"\1\">\4/'

관련 정보