【问题标题】:How to insert an arbitrary string after pattern with sed如何使用 sed 在模式后插入任意字符串
【发布时间】:2013-11-24 19:34:27
【问题描述】:

这一定很简单,但不知何故我不明白……我想通过 bash 脚本处理 HTML 文件并将 HTML-String 插入某个节点:

org.html:<div id="wrapper"></div>

MYTEXT=$(phantomjs capture.js www.somesite.com)
# MYTEXT will look something like this:
# <div id="test" style="top: -1.9%;">Something</div>

sed -i "s/\<div id=\"wrapper\"\>/\<div id=\"wrapper\"\>$MYTEXT/" org.html

我总是得到这个错误:bad flag in substitute command: 'd' 这可能是因为sed 也将$MYTEXT 的内容解释为一种模式——这不是我想要的……

顺便说一句:复制\&lt;div id=\"wrapper\"\&gt;可能也不需要?

【问题讨论】:

  • 这是一个相关问题:stackoverflow.com/q/584894/951890
  • "By the way: Duplicating \&lt;div id=\"wrapper\"\&gt; is probably also not necessary?": 是的,你可以使用 \1 的反向引用;您需要将\&lt;div id=\"wrapper\" 括在() 中。但是,对于静态 search string,这只是方便的问题,而不是要求。
  • 好吧,我确实试过这个:sed "s|(\&lt;div id=\"wrapper\"\&gt;)|\1$MYTEXT|" test.html 但我得到了这个错误作为回报:\1 not defined in the RE
  • 没关系 - 我在使用 BSD sed 的 Mac 上。 \1 必须替换为 &amp;: sed "s|(\&lt;div id=\"wrapper\"\&gt;)|&amp;$MYTEXT|" test.html

标签: regex string bash sed


【解决方案1】:

似乎$MYTEXT&lt;/div&gt; 部分中的/ 确实被解释为sed 命令中的最终/。您可以选择另一个分隔符,它不会出现在$MYTEXT 中,例如:

sed -i "s|\<div id=\"wrapper\"\>|\<div id=\"wrapper\"\>$MYTEXT|" org.html

【讨论】:

  • 这看起来不错!哪些字符可以作为分隔符?我需要选择一个非常稀有的,因为我不知道$MYTEXTs 的内容。使用例如 导致error: illegal byte sequence
  • 允许使用任何字符,即使是控制字符,例如 Control-A 或 Control-G。
  • 如何插入 Control-A,在我的终端中是跳转到行首的命令?
  • 点击 Control-V before ;这将使终端无法解释 Control-A 命令
  • 或者我可以使用ANSI-C Quoting 并使用$'\001' 之类的东西作为分隔符。
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2013-08-22
  • 1970-01-01
  • 2019-03-28
  • 2023-03-11
  • 2011-05-29
相关资源
最近更新 更多