我对脚本非常陌生,如果这听起来不清楚,请道歉。
我有一个文件路径,我想用sed切割:
文件路径类似于:
/to/be/removed/dir1a/keep/this/part
/to/be/removed/dir2b/keep/this/part
/to/be/removed/random/keep/this/part
我想确定,无论我得到哪种格式,我总是最终得到:
/keep/this/partRestored
我找到了类似的例子,但我不能使它们符合上述规范。
修改
对不起,问题的原始模板不太清楚。抱歉浪费你的时间。 我基本上在搜索文件的最新版本。 结果可以采用以下任何一种形式:
/home/backup/dir1/destination/file
/home/backup/dir2/destination2/file
/home/backup/folder/destination3/file
换句话说,我总是希望在 dir1 , dir2 或文件夹之前删除任何内容。 并将恢复附加到剩下的末尾。 我希望这更清楚。谢谢你的帮助。
答案 0 :(得分: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
修改强>
更具体一点
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
答案 1 :(得分:0)
您可以使用basename
和dirname
:
f=/home/backup/dir1/destination/file
echo /$(basename $(dirname $f))/$(basename $f)
答案 2 :(得分: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