1

正規表現を使用して、ファイル パスから 2 つのドットを単純化するにはどうすればよいでしょうか (パスは実際には存在しない可能性があります)。

たとえば、またはに変更/my/path/to/.././my/./../../file.txtします。/my/file.txtpath/./to/../../../file.txt../file.txt

bash の 1 つのコマンドでこれを行うことは可能ですか? (sedたとえば、複雑な python や perl スクリプトを使用しない)

編集:この質問に遭遇しましたがrealpath、使用しているコンピューターでは利用できません。

edit : FJのソリューションから、より一般的なケースで機能する次の正規表現を構築することになりました (パスの一部のフォルダーの名前が の場合は機能しません....)。

sed -e 's|/\./|/|g' -e ':a' -e 's|\.\./\.\./|../..../|g' -e 's|^[^/]*/\.\.\/||' -e 't a' -e 's|/[^/]*/\.\.\/|/|' -e 't a' -e 's|\.\.\.\./|../|g' -e 't a'
4

1 に答える 1

4

次のことを試してください。

sed -e 's|/\./|/|g' -e ':a' -e 's|/[^/]*/\.\./|/|' -e 't a'

例:

$ echo '/my/path/to/.././my/./../../file.txt' |
  sed -e 's|/\./|/|g' -e ':a' -e 's|/[^/]*/\.\./|/|' -e 't a'
/my/file.txt

アプローチの説明は次のとおりです。

read line
replace all '/\./' in line with '/'
while there is a match of '/[^/]*/\.\./' {
    replace first occurrence of '/[^/]*/\.\./' in line with '/'
}
output line
于 2013-04-19T16:55:23.227 に答える