문자열을 처리 중입니다.
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; }'
g
Perl 변형이 패턴의 반복되는 인스턴스를 처리하도록 대체 항목에 플래그를 추가하기만 하면 됩니다.
perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/g'