2014-10-31 4 views
-1

Я очень новичок в написании сценариев, поэтому извиняюсь, если это звучит неясно.Удаление части пути к файлу

У меня есть путь к файлу, который я Вана разрезали с помощью СЭД:

Путь к файлу может выглядеть примерно так:

/to/be/removed/dir1a/keep/this/part 
/to/be/removed/dir2b/keep/this/part 
/to/be/removed/random/keep/this/part 

Я хочу, чтобы убедиться, что, независимо от того, какой формат я получаю, Я всегда получаю:

/keep/this/partRestored 

Я нашел похожие примеры, но я не могу заставить их работать с вышеуказанными спецификациями.

EDIT

К сожалению оригинальный шаблон вопроса не было слишком ясно. Извините за то, что потратил ваше время. Я в основном ищу самую последнюю версию файла в. Результат может быть в любой из следующего вида:

/home/backup/dir1/destination/file 
/home/backup/dir2/destination2/file 
/home/backup/folder/destination3/file 

Другими словами, я всегда хочу, чтобы удалить все до dir1, dir2 или папку. И добавить восстановить до конца что осталось. Надеюсь, это более понятно. Спасибо за вашу помощь.

+2

примеры слишком общие. укажите соответствующие примеры – nu11p01n73R

+1

Какое правило? Сохранять последние 3 части пути? Удалить первые 4? Это зависит от шаблона? Пожалуйста, будьте более конкретными. –

+1

"keep/this/part" всегда то же самое? Лучшие примеры, пожалуйста, – Leon

ответ

1

Как насчет

sed -r 's#.*/(dir1|dir2|folder)(/.*$)#\2/restore#g' 

Тест:

sed -r 's#.*/(dir1|dir2|folder)(/.*$)#\2/restore#g' input 
/destination/file/restore 
/destination2/file/restore 
/destination3/file/restore 

EDIT

Чтобы быть более конкретным

sed -r 's#.*/(dir1|dir2|folder)[^/]*(/.*$)#\2/restore#g' 

Тест:

$ echo "/home/backup/dir1_a/destination/file" | sed -r 's#.*/(dir1|dir2|folder)[^/]*(/.*$)#\2/restore#g' 
/destination/file/restore 
+0

Что делать, если есть другие символы после dir1, dir2 и папки? например: /home/backup/dir1_a/destination/file /home/backup/dir2_b/destination2/file /home/backup/folder_c/destination3/file – SSF

+0

Фантастический. Это сделал трюк. жаль снова за то, что это стало неясным. Благодарю. – SSF

+0

@SSF_curious вы всегда рады :) – nu11p01n73R

0

Вы можете использовать basename и dirname:

f=/home/backup/dir1/destination/file 
echo /$(basename $(dirname $f))/$(basename $f) 
0

Удаление/изменение корневой части: /to/be/removed/dir1a/keep/this/part

  • всегда тот же самый корень

    sed 's#^/to/be/removed/#/NewPathYouWantAsRoot/#' InputFile

  • всегда одинаковая глубина корня (в данном образце, глубина = 3)

    sed 's#\(/[^/]*\)\{3\}/#/NewPathYouWantAsRoot/#' InputFile


добавление /keep/this/partRestored (взять также путь с / в качестве последнего символа, как папка)

sed 's#/\{0,1\}$#/keep/this/partRestored#' InputFile 

Любая комбинация из них может быть использована, просто отделите действие на ;. Пример:

sed 's#\(/[^/]*\)\{3\}/#/NewPathYouWantAsRoot/#;s#/\{0,1\}$#/keep/this/partRestored#' InputFile 
Смежные вопросы