我刚进入bash所以我决定写第一个脚本。为了给你一点背景,我想编写一个脚本,每当我连接USB记忆棒时,我都会将我的Documents文件夹备份到USB记忆棒上。 (我知道这样的软件存在)。
我在脚本的开头有两个字符串:
directoryPath="/Users/USER/Documents" # Folder I want to backup
backupPath="/Volumes/backMeUp/main" # Where I want the folder to backup
For循环为我提供了这样一个文件的绝对路径
/Users/USER/Documents/Comics/Bleach/Volume 004/bleach_031.zip
到现在为止我一直在使用这样的sed
newPath=`echo "$file" | sed "/Users\/USER\/Documents/s//Volumes\/backMeUp\/main/"`
但是,由于我希望我的脚本更“开放”,而且其他用户友好,我想摆脱这条线并以其他方式制作。
我也尝试了不同的语法
echo $file | sed -e "s/$directoryPath/$backupPath/"
但没有运气。
我的问题是如何使用$ directoryPath删除部分字符串并将其替换为$ backupPath?
答案 0 :(得分:1)
这样的事情:
#!/bin/bash
directoryPath="/Users/rojcyk/Documents" # Folder I want to backup
backupPath="/Volumes/backMeUp/main" # Where I want the folder to backup
f=$(basename '/Users/rojcyk/Documents/Comics/Bleach/Volume 004/bleach_031.zip')
echo ${backupPath}/${f}
击> <击> 撞击> 的更新强>
#!/bin/bash
directoryPath="/Users/rojcyk/Documents" # Folder I want to backup
backupPath="/Volumes/backMeUp/main" # Where I want the folder to backup
f='/Users/rojcyk/Documents/Comics/Bleach/Volume 004/bleach_031.zip'
# delete shortest match of substring from front of string
new_f=${f#$directoryPath}
echo ${backupPath}${new_f}
输出:
/Volumes/backMeUp/main/Comics/Bleach/Volume 004/bleach_031.zip
详细了解bash字符串操作here
答案 1 :(得分:1)
使用bash:
directoryPath="/Users/rojcyk/Documents"
backupPath="/Volumes/backMeUp/main"
f="/Users/rojcyk/Documents/Comics/Bleach/Volume 004/bleach_031.zip"
echo "${backupPath}/${f#$directoryPath}"
可生产
/Volumes/backMeUp/main//Comics/Bleach/Volume 004/bleach_031.zip
中间的双斜线是可以的。如果您不想要它:"${backupPath}/${f#$directoryPath/}"
答案 2 :(得分:0)
这就是你想要的吗?
kent$ cat t
$foo$bar$blah
kent$ sed 's/\$foo/\$xxx/g' t
$xxx$bar$blah
还是这个?
kent$ echo $foo
/f/o/o
kent$ echo $bar
/b/a/r
kent$ cat t
something /f/o/o
kent$ sed "s:$foo:$bar:" t
something /b/a/r
答案 3 :(得分:-1)
sed -e "s/$directoryPath/$backupPath/"
你是在正确的道路上,只需要先操纵两个路径变量。
$directoryPath
的内容为/Users/rojcyk/Documents
,因此您的sed命令将显示为sed -e "s//Users/rojcyk/Documents//Volumes/backMeUp/main/"
。您需要转义目录斜杠,以免它们影响sed命令。
试试这个:
directoryPathEscaped=`echo $directoryPath | sed -e "s/\\//\\\\\\\\\//g"`
backupPathEscaped=`echo $backupPath| sed -e "s/\\//\\\\\\\\\//g"`
# At this point, directoryPathEscaped is equal to "\/Users\/rojcyk\/Documents"
# Now you can do your original command line, with the new variables.
sed -e "s/$directoryPathEscaped/$backupPathEscaped/"