2014-10-31 176 views
-1

我對腳本非常陌生,所以如果這聽起來不太清楚,請道歉。刪除文件路徑的一部分

我有我婉削減了使用文件路徑的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 

換句話說,我總是希望DIR1DIR2文件夾之前刪除任何東西。 AND追加恢復到最後什麼剩下。 我希望這更清楚。謝謝你的幫助。

+2

這些例子太籠統了。請提供相關示例 – nu11p01n73R 2014-10-31 11:39:38

+1

規則是什麼?保留路徑的最後3個部分?刪除第一個4?它取決於模式嗎?請更具體一些。 – 2014-10-31 11:40:36

+1

是「keep/this/part」總是一樣嗎?更好的例子請 – Leon 2014-10-31 11:41:05

回答

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 
+0

如果在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

+0

太棒了。那就是訣竅。再次抱歉,因爲它不清楚。謝謝。 – SSF 2014-10-31 12:18:16

+0

@SSF_curious你總是歡迎:) – nu11p01n73R 2014-10-31 12:18:58

0

你可以使用basenamedirname

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