一条命令删除大量单词

一条命令删除大量单词

我有很多链接,例如

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)是正则表达式,匹配.svgor 。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参数(更简单地缩写为)::ijpgJPG

~$ 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。

https://raku.org/

相关内容