我有很多链接,例如
https://content.example.net/skin/frontend/2015/default/fonts/test.ttf
https://content.example.net/skin/frontend/2015/default/img/test.svg
https://content.example.net/skin/frontend/2015/default/fonts/test.eot
https://content.example.net/skin/forntend/2015/default/js/test.js
如何从 url 中包含 css、jpg、svg、png、ttf 等文字的文件中删除链接
现在使用类似的东西
cat url.txt | sed '/png/d' | sed '/jpg/d' | sed '/svg/d' | ...etc
这需要花费大量的时间和精力
这件事能一蹴而就吗?
答案1
您可以对正则表达式使用“OR”语法:
sed -E '/png|jpg|svg/d' url.txt
这将删除包含任一模式的所有行。如果要确保该模式是文件扩展名,即该模式出现在该行的末尾,您可以在正则表达式中包含锚点:
sed -E '/(png|jpg|svg)$/d' url.txt
顺便说一句,您永远不需要将cat
文件放入sed
;它可以自行读取所有内容。
答案2
您还可以使用 Grep:
grep -vE '\.(svg|jpg|png)' file
-v
仅打印不匹配的行并-E
启用扩展正则表达式。
\.(svg|jpg|png)
是正则表达式,匹配.svg
or 。jpg
或者.png
。
如果你想修改该文件,
将 Ed 与全局命令一起使用:
printf '%s\n' 'g/\.\(svg\|jpg\|png\)/d' w q | ed -s file
g
是全局命令,d
删除匹配的行,w
保存更改并q
退出。在带有 Bash 和 Vim 的 GNU/Linux 系统中,
vim -e file<<<'g/\v\.(svg|jpg|png)/d|x'
g
再次是全局命令,\v
禁用转义括号的需要,并x
保存更改。
答案3
grep
更适合。
生成模式文件,例如:
printf '\\.%s$\n' svg jpg png > patterns.txt
并使用以下命令删除行:
grep -vf patterns.txt url.txt
或者直接:
grep -ve "$(printf '\\.%s$\n' svg jpg png)" url.txt
输出:
https://content.example.net/skin/frontend/2015/default/fonts/test.ttf
https://content.example.net/skin/frontend/2015/default/fonts/test.eot
https://content.example.net/skin/forntend/2015/default/js/test.js
答案4
使用 Raku(née Perl 6)
获取 OP 的原始url.txt
文件并添加以 结尾的虚拟行*.txt
,这是使用 Raku 的答案:
~$ cat url.txt | raku -ne '.say unless .ends-with( "ttf" | "svg" | "eot" | "js" );'
输出:
https://content.example.net/skin/forntend/2015/default/js/test.txt
上面的代码适用于您想要查看行尾的特定情况(它利用 Raku 的ends-with
例程)。if
如果您想选择是否存在行结尾,请使用;用于unless
选择是否存在行结尾(unless
相当于if not
)。
请注意,如果您有名为和的文件,则该ends-with
例程还需要一个:ignorecase
参数(更简单地缩写为)::i
jpg
JPG
~$ cat url.txt | raku -ne '.say unless .ends-with( "ttf" | "svg" | "eot" | "js", :ignorecase );'
输出:
https://content.example.net/skin/forntend/2015/default/js/test.txt
HTH。