모든 *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
있습니다 ( 일부 구현에서 빌림).-i
sed