在 Linux 中使用 sed 命令将带有星号(**)的文本转换为斜体

在 Linux 中使用 sed 命令将带有星号(**)的文本转换为斜体

要求如下:将带星号的文本转换为斜体。不要触碰双星号(粗体)中的文本。使用 sed 命令。例如,

*italic*  =>  <em>italic<\em>
**not italic**  =>  **not italic** (nothing change)
*text**text*   =>   <em>text**<\em>

这是我的命令:

sed -n -r 's#(^|[^*])\*([^*]+)\*#\1<em>\2</\em>#gp' test.txt

它适用于情况 1 和 2,但对于情况 3,它给出了错误的输出:

<em>text <\em>* text*

我该如何让它正常工作?

答案1

问题是*not italic*是的子字符串**not italic**,因此根据您的规则,应该是斜体。

我尝试将 regexp(\*((?!\*)(.+?))\*)与测试程序 check-regexp 一起使用,效果很好,但刚才提到的问题仍然存在。请参阅...

$ check-regexp '(\*((?!\*)(.+?))\*)' '****alpha**beta**gamma***'

searching      : ****alpha**beta**gamma***
for the regexp   : (\*((?!\*)(.+?))\*)
num of subexps   : 3
prefix: ***
what[0]: *alpha*
  what[1]: *alpha*
  length: 7
  what[2]: alpha
  length: 5
  what[3]: alpha
  length: 5
suffix: *beta**gamma***
what[0]: *beta*
  what[1]: *beta*
  length: 6
  what[2]: beta
  length: 4
  what[3]: beta
  length: 4
suffix: *gamma***
what[0]: *gamma*
  what[1]: *gamma*
  length: 7
  what[2]: gamma
  length: 5
  what[3]: gamma
  length: 5
suffix: **
total number of matches: 3


$ check-regexp '(\*((?!\*)(.+?))\*)' '****alpha**'

searching      : ****alpha**
for the regexp   : (\*((?!\*)(.+?))\*)
num of subexps   : 3
prefix: ***
what[0]: *alpha*
  what[1]: *alpha*
  length: 7
  what[2]: alpha
  length: 5
  what[3]: alpha
  length: 5
suffix: *
total number of matches: 1

相关内容