sedまたはawkパターン間の文字列の置き換え(絶対パスを相対パスに変換)

sedまたはawkパターン間の文字列の置き換え(絶対パスを相対パスに変換)

結局のところ、絶対パスを相対パスに置き換えるより大きなスクリプトの一部として、パス内のすべてのフォルダを「..」に置き換えようとします。

予想される出力は次のようになります。

/ABCDdasda234sEA/asdas2das/asdasf34234/ => /../../../
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/ => /../../../../

さまざまな正規表現を試しましたが、最後の "/"は何度も一致せず、文字列の終わりと見なされるため、一致を正しく取得できませんでした。

[root@test]# sed "s/^\/.*\/$/\/..\//g" <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/"

/../

答え1

1).*次のスラッシュを含むすべてを食べるので[^/]*(スラッシュを除くすべての文字を使用してください)

2)すべてのバージョンで利用できない問題\+(「1回以上発生」)を避けるために、sed少なくとも1つの文字が必要な点を追加してください。[^/]他の人がいないと信じるなら、ここに他の人は必要ありません//

s_3)美化のため:パターンや代替項目にスラッシュが含まれている場合、またはコマンドに別の区切り文字を使用すると読みやすくなります。#

すべてを一度に:

sed 's_/.[^/]*_/.._g'

答え2

awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if (length($i)) $i = ".."}1' <<END
/ABCDdasda234sEA/asdas2das/asdasf34234/
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/
END
/../../../
/../../../../

答え3

同時に、私はさらに2つの方法を見つけました。

sed 's:/[[:alnum:]]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346346/" | sed 's:^..::g'


awk -F'/' '{for( i = 2; i <= NF-1; i++ ) printf "/../" }' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/asfasddfg/2345555/"  | sed 's/\/\//\//g'

「_」などの他の特殊文字も含まれます。

sed 's:/[[:alnum:]_]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346$346/" | sed 's:^..::g'

答え4

一部のバージョンsed正規表現の高度な機能(例:+または{})基本的に。私のシステムでは\+うまくいきます。

または交換することができます。\wこれと共に[^/]これは、ファイル名にスペースを含めることができるためです。

関連情報