一个命令删除很多单词

abd*_*aEG 4 sed text-processing

我有很多链接,比如

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
Run Code Online (Sandbox Code Playgroud)

如何从包含 url 中的单词的文件中删除链接,如 css、jpg、svg、png、ttf ..etc

现在使用类似的东西

cat url.txt | sed '/png/d'  | sed '/jpg/d' | sed '/svg/d' | ...etc 
Run Code Online (Sandbox Code Playgroud)

这需要花费大量的时间和精力

这件事可以用一个命令代替吗?

Adm*_*Bee 18

您可以对正则表达式使用“OR”语法:

sed -E '/png|jpg|svg/d' url.txt
Run Code Online (Sandbox Code Playgroud)

这将删除包含任一模式的所有行。如果你想确保这个模式是文件扩展名,即模式出现在行尾,你可以在正则表达式中包含一个锚点:

sed -E '/(png|jpg|svg)$/d' url.txt
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您永远不需要将cat文件放入sed; 它可以自己阅读所有这些。


Qua*_*odo 9

您还可以使用 Grep:

grep -vE '\.(svg|jpg|png)' file
Run Code Online (Sandbox Code Playgroud)

-v只打印不匹配的行并-E启用扩展的正则表达式。

\.(svg|jpg|png)是匹配.svgor的正则表达式。jpg.png

如果要修改文件,

  • 将 Ed 与全局命令一起使用:

    printf '%s\n' 'g/\.\(svg\|jpg\|png\)/d' w q | ed -s file
    
    Run Code Online (Sandbox Code Playgroud)

    g是全局命令,d删除匹配的行,w保存更改并q退出。

  • 在带有 Bash 和 Vim 的 GNU/Linux 系统中,

    vim -e file<<<'g/\v\.(svg|jpg|png)/d|x'
    
    Run Code Online (Sandbox Code Playgroud)

    g再次是全局命令,\v禁用转义括号的需要,并x保存更改。


Tho*_*hor 5

grep 更适合。

生成模式文件,例如:

printf '\\.%s$\n' svg jpg png > patterns.txt
Run Code Online (Sandbox Code Playgroud)

并删除行:

grep -vf patterns.txt url.txt
Run Code Online (Sandbox Code Playgroud)

或者直接:

grep -ve "$(printf '\\.%s$\n' svg jpg png)" url.txt
Run Code Online (Sandbox Code Playgroud)

输出:

printf '\\.%s$\n' svg jpg png > patterns.txt
Run Code Online (Sandbox Code Playgroud)