So-net無料ブログ作成

ファイルパスの不要な/の削除 [Linux]

シェルスクリプトで、ファイルパスの不要な / を削除しようとして少々手間取ってしまった、
以下は、備忘録としてまとめたものである。

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() の戻り値は変換後の文字列である(元の文字列を変更しない)。


3. sed の正規表現


基本正規表現と拡張正規表現(-r オプションの指定)が使用できる。
また、それぞれの特徴は、下記の通りである。

(1) 基本正規表現 (BRE: Basic Regular Expression)


(a) +、? での繰り返しには \ でのクォートが必要


\+: \{1,\} と同じ
\?: \{,1\} と同じ


(b) グループ化には \ でのクォートが必要


\(.*\)


(c) 繰り返しには \ でのクォートが必要


\{m,n\}


(d) 論理和の指定には \ でのクォートが必要


a\|b


(2) 拡張正規表現 (ERE: Extended Regular Expression)


(a) +、? での繰り返しには \ でのクォートが不要


+: {1,} と同じ
?: {,1} と同じ


(b) グループ化には \ でのクォートが不要


(.*)


(c) 繰り返しには \ でのクォートが不要


{m,n}


(d) 論理和の指定には \ でのクォートが不要


a|b



nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。