如何使用 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

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实现已借用)

相关内容