2016-03-24 14 views
1

変数の展開とスラッシュの無視に問題があります。bash変数のスラッシュをエスケープしないようにします。

私はgitリポジトリにテキストを見つけ、それを他のテキストに置き換える簡単なスクリプトを書いています。これは正常に動作しますが、今はregexを使って展開したいと思います。 git grepとsedの両方が正規表現をサポートしているので、これはあまり問題にならないはずです。しかし、入力変数に正規表現を使用しようとするとスラッシュが削除され、スクリプトが破棄されます。

端末でgit grep "\bPoint"を実行すると、多くの結果が得られます。しかし、スクリプトでユーザー入力を使用すると、同じ結果を得る方法を理解できません。 git grepファイルは\bPointの代わりに入力をbPointに変更し、sedに与える結果は見つかりません。

#!/bin/bash 

# This script allows you to replace text in the git repository without damaging 
# .git files. 

read -p "Text to replace: " toReplace 
read -p "Replace with: " replaceWith 

git grep -l ${toReplace} 

# The command I want to run 
#git grep -l "${toReplace}" | xargs sed -i "s,${toReplace},${replaceWith},g" 

私は引用のさまざまな組み合わせを試してみましたが、何も私のために働くようです。

+0

スラッシュはありません、それはバックスラッシュです。 –

答えて

2

read -rを使用する必要があります。

-rは、バックスラッシュは任意の文字

例脱出することはできません:help readあたりのよう

# without -r 
read -p "Text to replace: " toReplace && echo "$toReplace" 
Text to replace: \bPoint 
bPoint 

# with -r 
read -rp "Text to replace: " toReplace && echo "$toReplace" 
Text to replace: \bPoint 
\bPoint 
+1

それはそうしました。ありがとう! – user2445507

+1

また、予期しない単語の分割やワイルドカードの拡張を避けるために、変数参照(例えば 'git grep -l" $ {toReplace} "')を二重引用符で囲みます。 –

関連する問題