【问题标题】:using sed for substitution in next line在下一行使用 sed 进行替换
【发布时间】:2018-07-30 09:40:22
【问题描述】:

我正在使用 sed 命令将一些文本翻译成另一个文本。

猫文字

           <strong>ABC
           </strong>

通讯:

           sed -e 's|<strong>(.*?)</strong>|//textbf{1}|g'

预期结果:\textbf{ABC}

但使用上面的脚本我无法将其转换为预期的输出,因为标签之间有新行。这种情况如何处理?

【问题讨论】:

  • 使用nN 用sed 构建多行模式空间。
  • 我使用了 sed -ne 's|<strong>(.*?)</strong>|//textbf{1}|g' 文本,但没有输出。
  • 不是-nN 在 sed 命令中。这是一个链接,其中包含有关在 sed 中使用多行的详细信息:grymoire.com/Unix/Sed.html#uh-51

标签: sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -r '$!N;s|(&lt;)(strong&gt;)([^\n]*)\n\s*\1/\2|//textbf{\3}|;P;D' file

sed '$!N;s|\(&lt;\)\(strong&gt;\)\([^\n]*\)\n\s*\1/\2|//textbf{\3}|;P;D' file

【讨论】:

  • 我有强如 br 和强如 <strong>ABC 中风<br /> </强> ,我有点困惑,因为它是嵌套的。
【解决方案2】:
sed -e 'N;s|&lt;strong&gt;\(.*\?\)\n&lt;/strong&gt;|\/textbf{\1}|g'

正如 CodeGnome 和 David Ravetti 所说,N 标志允许多行模式。

【讨论】:

  • 我正在使用 sed -e 'N;s|<strong>(.*\?)\n</strong>|\/textbf{\1}|g' 文本但仍然没有改变。
  • 您缺少 (. 前面的 \
  • @cdbitesky - 在你的例子中你有\? ...这是故意的吗?似乎它会搜索文字“?”当我认为 OP 的意图是使 (.*) 部分可选时(我认为没有必要,因为“*”应该匹配零个或多个)。
  • 我认为\?可能没有必要。我只需要匹配标签中的任何内容。
  • 我的 sed 版本使用 ?作为字面的“?”和 \?具有正则表达式字符。我不知道为什么。
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2013-11-04
  • 2020-10-09
  • 1970-01-01
  • 2022-01-19
  • 2020-02-02
相关资源
最近更新 更多