我需要检查所有我的css
和js
文件,如果引用的文件名有任何斜杠 ( /
),则应删除斜杠。
我想要的是:
如果引用的任何文件已命名,
/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'`
知道如何做到这一点吗?我正在使用.sh
shell 脚本执行此操作。
答案1
不要解析find
这种方式的输出。如果您的文件不包含任何特殊字符,它就会起作用,但要对 找到的文件调用命令,调用该命令find
会更容易、更可靠:find
find "$new_directory" -name '*.css' -o -name '*.js' -exec grep … {} +
那么grep
这不是执行文本替换的正确工具;它只是一个搜索工具。sed
是一个流编辑器,其最广泛使用的功能是正则表达式替换。假设 GNU sed(例如在 Linux 上找到的),并假设您的正则表达式基本上是正确的,即您想要匹配所有字母或数字或后跟:._-
可能看起来的扩展名的序列作为文件名,这里是到处sed
调用替换:DIR1/DIR2/FILE.EXT
FILE.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