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
; 它可以自己阅读所有这些。
您还可以使用 Grep:
grep -vE '\.(svg|jpg|png)' file
Run Code Online (Sandbox Code Playgroud)
-v
只打印不匹配的行并-E
启用扩展的正则表达式。
\.(svg|jpg|png)
是匹配.svg
or的正则表达式。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
保存更改。
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)