从 CSS 和 Javascript 内容内的文件名中删除斜杠/父路径

从 CSS 和 Javascript 内容内的文件名中删除斜杠/父路径

我需要检查所有我的cssjs文件,如果引用的文件名有任何斜杠 ( /),则应删除斜杠。

我想要的是:

  • 如果引用的任何文件已命名,/file.jpg则删除前导斜杠,只留下file.jpg.

    例如,在 CSS 文件中更改:

    @import url("/base.css");@import url("base.css");

  • 如果引用的文件已命名,/files/file.jpg则应删除前导斜杠和文件夹名称,只留下file.jpg.

我开始写它,但后来无法思考如何处理斜线。

grep -o -h -E '[A-Za-z0-9:./_-]+\.(png|jpg|gif|tif|css)' `find
${new_directory} -name '*.css' -or -name '*.js'`

知道如何做到这一点吗?我正在使用.shshell 脚本执行此操作。

答案1

不要解析find这种方式的输出。如果您的文件不包含任何特殊字符,它就会起作用,但要对 找到的文件调用命令,调用该命令find会更容易、更可靠:find

find "$new_directory" -name '*.css' -o -name '*.js' -exec grep … {} +

那么grep这不是执行文本替换的正确工具;它只是一个搜索工具。sed是一个流编辑器,其最广泛使用的功能是正则表达式替换。假设 GNU sed(例如在 Linux 上找到的),并假设您的正则表达式基本上是正确的,即您想要匹配所有字母或数字或后跟:._-可能看起来的扩展名的序列作为文件名,这里是到处sed调用替换:DIR1/DIR2/FILE.EXTFILE.EXT

sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'

将这两部分放在一起,如果您想进行替换,最简单的方法是使用 GNU sed 的-i选项,它就是这样做的。

find "$directory" -name '*.css' -o -name '*.js' \
     -exec sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g' {} +

如果您想将替换文件放在不同的位置,则需要一些中间 shell 胶水来构造新文件的名称。

find "$old_directory" -name '*.css' -o -name '*.js' \
     -exec sh -c 'sed -e '\''s![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'\' <"$0" >"/new/directory/$0"' {} \;

请注意使用 来'\''将单引号放入单引号 shell 代码片段中。-exec … {} \;意味着对每个文件运行该命令一次,与之相反的-exec … {} +是在一批中尽可能多的文件上运行该命令。

答案2

使用basename内置的。它的工作原理如下:

$ basename "/abc/def/ghi.jkl"
ghi.jkl

相关内容