ファイルパスの不要な/の削除 [Linux]
シェルスクリプトで、ファイルパスの不要な / を削除しようとして少々手間取ってしまった。
以下は、備忘録としてまとめたものである。
1. 要求仕様
2. 実行例
以下は、備忘録としてまとめたものである。
1. 要求仕様
ファイルパスから不要な / を取り除く。
・/ が連続する部分を / に変更
・最後の / を削除
2. 実行例
(1) sed の場合
(a) 基本正規表現を使用する場合
% echo ..//aa//bb//cc// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!' ../aa/bb/cc % echo /// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!' /
(b) 拡張正規表現を使用する場合
% echo ..//aa//bb//cc// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!' ../aa/bb/cc % echo /// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!' /
(c) 失敗例
% echo ..//aa//bb//cc// | sed -e 's!/*!/!g' -e 's!\([^/]\)/$!\1!' /././a/a/b/b/c/c
(2) awk の場合
% echo ..//aa//bb//cc// | \ awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}' ../aa/bb/cc % echo /// | \ awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}' /
(補足)
・gsub() および sub() では "\\1" が機能しない。
・gensub() の戻り値は変換後の文字列である(元の文字列を変更しない)。