2017-04-10 9 views
-1

基本的に./foo/bar./foo/bar/barに変換したいとします。私は最初にsedを試しましたが、私が思いついた正規表現は、sedがサポートしていないlookaround((?<=s\/)(.*))または\Kエスケープシーケンス(.*\/\K.*)を使用しています。基本名を抽出してパスに追加する方法

+0

その内容の単一の変数については?このような行がたくさんあるファイルですか? –

+0

@Benjamin W. findコマンドの出力用です:find。 -mindepth 2 -type d! -path。 ! -path ./foo – user3044148

+0

**あなたの**コードの欠けている部分について話さなくても、問題の説明もあいまいです。パスが次のうちのどれかになる場合、どうすればいいでしょうか?: '/'または '.'や' ..'や './ ..'など?または? './qoo/qxx/../../../ some/exotic/beauty /../'です。 – jm666

答えて

3

「どのように私は/path/to/name/nameを追加しない」の一般的なケースでは、あなたはパラメータ展開を使用することができますが:

$ var='./foo/bar' 
$ echo "$var/${var##*/}" 
./foo/bar/bar 

${var##*/}は(何で終わる*/の最長の可能なマッチで$varの値に展開されますスラッシュ)を最初から削除します。

あなたは行ごとにこれらのエントリのいずれかを使用してファイルを持っている場合、あなたはSEDで、このような何かを行うことができます:

$ cat infile 
./foo/bar 
./foo/bar/baz 
./path/to/file 
$ sed 's/\([^/]*\)$/\1\/\1/' infile 
./foo/bar/bar 
./foo/bar/baz/baz 
./path/to/file/file 

これは、それぞれの行の最後の/後にすべてのものをキャプチャし、スラッシュを追加し、捕獲シーケンスを行の最後に追加します。

+0

何も良い古い*パラメータの展開で部分文字列を削除する*、良い仕事。 –

+0

@ DavidC.Rankin追加:_mostly_。 :)この答えは_most_の場合にはうまく簡潔です。 DWIM: '/ foo/bar /'、 '/ foo/bar //'(例えば、スラッシュ(es))や '..'のような角の場合(親ディレクトリ、' ./ .. 'そういうエキゾチックな(しかし有効な)_パス)。だから、いい答えですが、何もないビートは完全に真実ではありません。 ;) – jm666

関連する問題