POSIX 확장 정규식(sed용)을 사용하여 문자열을 제외한 모든 문자를 일치시키려면 어떻게 해야 합니까?

POSIX 확장 정규식(sed용)을 사용하여 문자열을 제외한 모든 문자를 일치시키려면 어떻게 해야 합니까?

문자열을 처리 중입니다.

Input File
----
some**wor*ds**with**asterisks

말하여 sed어떤 문자와도 일치시킵니다 .아니요별표:

echo "some**words** **" | sed -E 's/\*\*([^*]+)\*\*/FOO\1FOO/g'

그러면 다음이 올바르게 출력됩니다.someFOOwordsFOO **

그러나 이는 위의 상황에는 적용되지 않습니다 Input File. 그러므로 나는 sed에게 다음 두 개의 별표를 무시하라고 말하고 싶습니다.

sed -E 's/\*\*([^*]+)\*\*/FOO\1FOO}/g' IF

출력됩니다:

some**wor*dsFOOwithFOOasterisks

내가 좋아해야 할 것은 :

someFOOwor*dsFOOwith**asterisks

답변1

Perl을 사용하여 탐욕스럽지 않게 단어를 캡처하세요.

$ echo 'some**wor*ds**with**asterisks' | perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/'
someFOOwor*dsFOOwith**asterisks

이는 첫 번째 일치 항목에서 **다음으로 가장 가까운 일치 항목으로 이동하여 **일치하는 비트를 FOO, 사이의 하위 문자열 로 바꾼 다음 **다시 바꿉니다 FOO. 탐욕스럽지 않은 일치 항목이 없으면 **표현식의 두 번째 항목이 일치합니다.마지막그 후에는 이와 같은 문자열이 사용됩니다 with.

사용 sed:

$ echo 'some**wor*ds**with**asterisks' | sed '/\*\*.*\*\*/ { s/\*\*/FOO/; s//FOO/; }'
someFOOwor*dsFOOwith**asterisks

**이렇게 하면 줄의 첫 번째 항목이 로 바뀌고 FOO다음 항목도 대체됩니다. 단, 줄에 **하나와 다른 항목이 포함된 경우에만 해당됩니다 **.

**이 두 항목이 줄의 어느 하위 문자열에 있는지는 신경 쓰지 않고 a가 **다음으로 가장 가까운 일치 항목 이라는 점만 주의하세요 **. 이는 위의 두 명령 모두에 적용됩니다.


댓글의 예를 살펴보세요.

some**wor*ds**with**asterisks some**wor*ds**with**asterisks

sed이는 더 이상 할 일이 없을 때까지 이미 제공된 솔루션을 반복하는 명시적 루프로 처리할 수 있습니다 .

sed -e ':again' -e '/\*\*.*\*\*/ { s/\*\*/FOO/; s//FOO/; b again; }'

gPerl 변형이 패턴의 반복되는 인스턴스를 처리하도록 대체 항목에 플래그를 추가하기만 하면 됩니다.

perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/g'

관련 정보