unix 用sed替换字符串,除非它包含给定的子字符串

3ks5zfa0  于 2023-05-28  发布在  Unix
关注(0)|答案(2)|浏览(252)

我有一个文件,其中包含许多链接的形式<a href="foo">。这些需要被赋予一个.html扩展名,我有以下命令来做到这一点:

sed -i 's/\(href="\)\([^"]*\)/\1\2.html/g' "$FILE"

然而,我需要 * 不 * 这样做的任何链接,其中有一个协议(例如:https://或已经有扩展名(例如.css.js-很高兴只匹配这些。
我该怎么做?sed在这里仍然是一个合适的工具吗?

qpgpyjmq

qpgpyjmq1#

这个sed可以工作。

$ sed -Ei.bak '/https|\.[a-z]+/!s/"[^"]*/&.html/' input_file

如果没有,请考虑在问题中添加更多信息。

8nuwlpux

8nuwlpux2#

awk -F "<|>" 
         '/a href=\"https/ { 
                             for(i=1;i<=NF;i++) { 
                                                  if (match($i,"a href=\"https")) { 
                                                            split($i,arr,"\"");
                                                            if (!match(arr[2],".")) { 
                                                               sub(arr[2],arr[2]".html",$0) 
                                                            } 
                                                  } 
                                                 } 
                            }1' inputfile > inputfile1

使用awk作为替代方法,将文件分隔符设置为“<”或“>”,然后搜索包含'a href=“https'的所有行(这将忽略http条目)
根据分隔符循环遍历所有字段。
如果该字段包含'a href=“https',则处理该字段。根据分隔符'"'将字段拆分为数组arr。因此,条目arr[2]将包含href条目,即foo
处理foo,如果条目没有“.”(使用awk的match函数检查),则将arr[2]替换为arr[2],并将“.html”附加到末尾(使用awk的sub函数)。使用1打印对行所做的更改。
更改将输出到inputfile 1
一旦您验证了更改是正确的:

mv inputfile1 inputfile

相关问题