我想将所有出现的 *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
ETC。
我怎样才能做到这一点?
答案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:
perl -0777 -pe 's/\*(.*?)\*/{\\i $1}/gs'
但请注意,它在进行替换之前会占用内存中的整个文件,这对于大文件可能会出现问题。另请注意,perl
有一个-i
选项可以就地更新文件(某些sed
实现已借用)