如何用变量删除字符串的一部分?

时间:2012-03-28 12:55:58

标签: macos bash

我刚进入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?

4 个答案:

答案 0 :(得分:1)

<击> basename(和dirname)是您的朋友。

这样的事情:

#!/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/"