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
これを行うにはシェルスクリプトを使用しています。
答え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'
これら2つの部分を組み合わせて交換したい場合は、最も簡単な方法はすぐに-i
それを実行するGNU sedオプションを使用することです。
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' {} +
代替ファイルを別の場所に配置するには、新しいファイルの名前を構成するために中間シェル接着剤が必要です。
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"' {} \;
'\''
一重引用符で囲まれたシェルの断片に一重引用符を挿入する方法を参照してください。一括してできるだけ多くのファイルに対してコマンドを実行する-exec … {} \;
のとは異なり、各ファイルに対して一度コマンドを実行することを意味します。-exec … {} +
答え2
basename
内蔵のものを使用してください。仕組みは次のとおりです。
$ basename "/abc/def/ghi.jkl"
ghi.jkl