我陷入了 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="b
in 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 运算符。