sed를 사용하여 *text*를 {\i text}로 변환하는 방법은 무엇입니까?

sed를 사용하여 *text*를 {\i text}로 변환하는 방법은 무엇입니까?

모든 *text* 항목을 {\i text}로 바꾸고 싶습니다.

text *text* text
*text* text *text*
*text text text* text

되어야 한다

text {\i text} text
{\i text} text {\i text}
{\i text text text} text

등.

어떻게 해야 하나요?

답변1

각 가설은 *some text*한 줄에 표시됩니다(즉, 여러 줄로 분할되지 않음).

sed -r 's/\*([^*]+)\*/{\\i \1}/g' file

답변2

POSIX와 마찬가지로 여러 줄에 걸쳐 표시할 수 sed있으면 *...*다음과 같이 할 수 있습니다.

sed -e :1 -e 's/\*\([^*]\{1,\}\)\*/{\\i \1}/g;/\*/!b' -e '$q;N;b1'

일부 sed구현에서는 패턴 공간 크기에 대한 제한이 상대적으로 낮으므로 *...*너무 많은 (긴) 행이 확장되면 이러한 구현이 실패할 수 있습니다.

펄 사용:

perl -0777 -pe 's/\*(.*?)\*/{\\i $1}/gs'

그러나 교체를 수행하기 전에 메모리의 전체 파일을 차지하므로 대용량 파일의 경우 문제가 될 수 있습니다. 또한 파일을 제자리에서 업데이트하는 옵션이 perl있습니다 ( 일부 구현에서 빌림).-ised

관련 정보