Sed 替换不以 http:// 开头的部分行

Sed 替换不以 http:// 开头的部分行

我陷入了 sed 的困境..我试图在 html 文件中的链接不以 http 开头时使用 / 作为前缀。我知道这可能不是解决此问题的最佳方法,但我我只是在寻找一个简单的快速/解决方案。

到目前为止,我已经尝试过这个(注意 IRL 我将使用 -i in place 标志等,这只是为了测试):

echo '<a href="egww">blah</a><a href="http://bloge.weg">yeah</a>' |
sed 's@href="[^http]@href="/@g'

这几乎有效:

<a href="/gww">blah</a><a href="http://bloge.weg">yeah</a>

除了第一个链接的第一个字符被切断之外,我还认为它不是在 h、t、t 或 p 上不匹配,而是在整个字符串 http 上不匹配:

echo '<a href="egww">blah</a><a href="p/bloge.weg">damn</a>' |
sed 's@href="[^http]@href="/@g'

<a href="/gww">blah</a><a href="p/bloge.weg">damn</a>

在这一点上我很困惑,不幸的是谷歌在这里没有多大帮助,因为 sed 的否定通常用于删除包含字符串的行,而不是不匹配行中的子字符串。我尝试了几种“正常”正则表达式模式,但这些似乎不起作用。

有任何想法吗?

答案1

[^http]不是除了http。该 RE 匹配一个字符,只要它既不是h、也不是t、也不是p。所以href="[^http]匹配href="bin href="blah",但不href="t匹配 in href="toto"

在这里,你想要这样的东西:

sed -E 's@(href=")([^h]|h([^t]|t([^t]|t([^p]|$)|$)|$)|$)@\1/\2@g'

后面href="跟着 not- h(除 之外的字符h)、或h-not- t、或ht-not- t、或htt-not- p、或htt-EOL、或ht-EOL 或h-EOL 或 EOL。 (EOL ==“行尾”,最后 4 个不太可能在输入中找到,因为这意味着"不匹配)。

(假设您sed支持尚未标准的-E选项)。

您还可以添加/always,但在when in之后将其删除href="/http

sed 's@href="@&/@g;s@href="/http@href="http@g'

或者与perl

perl -pe 's|href="\K(?!http)|/|g'

使用 的perl负前瞻 RE 运算符。

相关内容