删除文件路径的一部分
我对脚本非常陌生,所以如果这听起来不太清楚,请道歉。删除文件路径的一部分
我有我婉削减了使用文件路径的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或文件夹之前删除任何东西。 AND追加恢复到最后什么剩下。 我希望这更清楚。谢谢你的帮助。
如何
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
如果在dir1,dir2和文件夹之后还有其他字符,该怎么办?例如: /home/backup/dir1_a/destination/file /home/backup/dir2_b/destination2/file /home/backup/folder_c/destination3/file – SSF 2014-10-31 12:06:41
太棒了。那就是诀窍。再次抱歉,因为它不清楚。谢谢。 – SSF 2014-10-31 12:18:16
@SSF_curious你总是欢迎:) – nu11p01n73R 2014-10-31 12:18:58
你可以使用basename
和dirname
:
f=/home/backup/dir1/destination/file
echo /$(basename $(dirname $f))/$(basename $f)
删除/更改根部分:/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
这些例子太笼统了。请提供相关示例 – nu11p01n73R 2014-10-31 11:39:38
规则是什么?保留路径的最后3个部分?删除第一个4?它取决于模式吗?请更具体一些。 – 2014-10-31 11:40:36
是“keep/this/part”总是一样吗?更好的例子请 – Leon 2014-10-31 11:41:05