删除文件路径的一部分

时间:2014-10-31 11:36:30

标签: linux bash sed

我对脚本非常陌生,如果这听起来不清楚,请道歉。

我有一个文件路径,我想用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 文件夹之前删除任何内容。 并将恢复附加到剩下的末尾。 我希望这更清楚。谢谢你的帮助。

3 个答案:

答案 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)

您可以使用basenamedirname

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