2012-03-28 11 views
1

私はちょうどbashに入ったので、私は最初のスクリプトを書くことに決めました。ちょっとした背景を与えるために、私はUSBスティックに接続するたびにDocumentsフォルダをUSBスティックにバックアップするスクリプトを書いていきたいと思っています。 (私はこのようなソフトウェアが存在することを認識しています)。変数を含む文字列の一部を削除する方法は?

私は、スクリプトの先頭で二つの文字列があります。私はこの

のようにsedを使用していた今までのループについて

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

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

+0

ええ、これは私が望んだものです! :)ドキュメントフォルダも構造化されているので、出力は次のようになります。/ Volumes/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/" 

あなたは正しいパスを使用していますが、最初に2つのパス変数を操作する必要があります。

$directoryPathの内容は/Users/rojcyk/Documentsなので、sedコマンドはsed -e "s//Users/rojcyk/Documents//Volumes/backMeUp/main/"となります。ディレクトリスラッシュをエスケープして、sedコマンドに影響を与えないようにする必要があります。

これを試してみてください:bashのでは

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

ありがとう:)理解しやすいので、私はあなたのようなコマンドを使用しないようにしたい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}" 

は途中でダブルスラッシュがOKである

/Volumes/backMeUp/main//Comics/Bleach/Volume 004/bleach_031.zip 

を生成します。あなたがそれを望んでいない場合:"${backupPath}/${f#$directoryPath/}"