2012-03-28 3 views
1

Я просто попал в bash, поэтому решил написать свой первый скрипт. Чтобы дать вам немного фона, я хочу написать сценарий, который будет поддерживать резервную копию папки «Мои документы» на USB-накопителе всякий раз, когда я подключаю USB-накопитель. (Я знаю, что такое программное обеспечение существует).Как удалить часть строки с переменной?

У меня есть две строки в начале сценария:

directoryPath="/Users/USER/Documents" # Folder I want to backup 
backupPath="/Volumes/backMeUp/main" # Where I want the folder to backup 

Для петель не дает мне абсолютный путь к файлу, как этот

/Users/USER/Documents/Comics/Bleach/Volume 004/bleach_031.zip 

До сих пор я использую СЭД как этот

newPath=`echo "$file" | sed "/Users\/USER\/Documents/s//Volumes\/backMeUp\/main/"` 

Но поскольку я хочу, чтобы мой скрипт был более «открытым» и дружественным к пользователю, я хочу избавиться от этого и сделать это по-другому.

Я также попытался это с другим синтаксисом

echo $file | sed -e "s/$directoryPath/$backupPath/" 

, но не повезло.

Мой вопрос: как удалить часть строки с помощью $ directoryPath и заменить ее на $ backupPath?

ответ

1

basenamedirname) ваш друг (ы).

Нечто подобное:

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

Подробнее о Баш операций строки here

+0

Да, это то, что я хотел! :) Дело в том, что папка «Документы» также структурирована, поэтому я хочу, чтобы результат был примерно таким:/Объемы/backMeUp/main/Comics/Bleach/Volume 004/bleach_031.zip – rojcyk

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

Спасибо :) Но я хочу, чтобы мой код легко понять, поэтому я хочу избежать использования таких команд, как yours sed. – rojcyk

+0

На самом деле правильным решением является использование другого разделителя. В идеале найдите символ, который не встречается в ваших данных. Может, толстой кишки 'sed 's: $ directoryPath: $ backupPath:" ' – tripleee

1

С Баш:

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/}"

Смежные вопросы