2017-01-05 8 views
-1

スクリプト呼び出しをサブディレクトリからスクリプト呼び出しに置き換えようとしています。エスケープを使用したLinux SEDコマンド構文

たとえば、元のスクリプトでは./output.shがありましたが、現在のディレクトリのoutput.shスクリプトを呼び出すことができました。

./output.sh../output.shに置き換えて、親ディレクトリのoutput.shを呼び出したいとします。

私はこれが

文字17で返す

sed -i -e 's/../\output.sh/./\output.sh/g' scriptName.sh 

を試してみました:sedのエスケープ文字構文を持つすべてのヘルプは素晴らしいことだ 'S' に

未知のオプション。

+1

"./output.sh"を "../output.sh"に置き換えるには、 'sed '@ \([^。] \)\ ./ output \ .sh @ \ 1を試してみてください。/output.sh @ g'(これは行頭のエントリとは一致しませんが、解決策としては良いスタートです)。しかし、これはあなたの問題を解決する正しい方法ではありません! –

+0

または[sed]を含む文字列を検索して置き換えます。/](http://stackoverflow.com/q/10309968/3266847)または[sed replaceでスラッシュを使用する](http://stackoverflow.com/q/5864146/3266847) –

答えて

0

s/something/replacement/flagsと指定すると、スラッシュ文字はsedのsコマンドで特殊なので、ファイルパスのスラッシュがエラーの原因になります。幸いにも、sの直後に他の文字を使用することができます。たとえば、[email protected]@[email protected]です。だから、コマンドを[email protected]\./[email protected]/[email protected]に置き換えることはすべきことです。

2つの追加の変更点に注意してください。最初の式でドットをエスケープする必要があります。これはregexの特殊文字でもあり、検索式と置換の逆順になります。 o文字の前にバックスラッシュは必要ありません。

sの後に/を使用することもできますが、置換するリテラルスラッシュは、バックスラッシュ(s/\.\/output.sh/..\/\output.sh/g)の前にエスケープすることができます。あなたのコードでは、このソリューションを使用しようとしましたが、スラッシュの前にバックスラッシュを置きます。

+1

ドットをエスケープしないと、文字列を 'directory/output.sh'として' director./ output.sh'に置き換えることができます。また、 '。/ output.sh'から' ../ output.sh'に変更すると、あなたのパターンは逆になります。 – charli

+1

@charliこれを指摘してくれてありがとう。私が気付かずにそれらの上を飛び越えた元の表現には、非常に多くの問題がありました。 –

0

これはトリックです。 ../output.shため./output.shのすべての出現を置換:

sed 's/\.\/output\.sh/\.\.\/output\.sh/g' scriptName.sh 

エスケープ文字が\です。あなたはそれをエスケープするために使うべきです:

  • すべての点.。ドットは、正規表現の任意の文字として使用されます。
  • スラッシュはすべて/です。スラッシュ文字は、sコマンドの正規表現間の区切り文字として使用されます。
1

これは悪いです。慎重でない場合は、すでに存在する../output.sh.../output.shに変更するリスクがあります。

これが最善のsedさを行うことができます。

sed -i '[email protected]\[email protected]/[email protected]' scriptName.sh 

(私は楽しみがないので、/の代わりに@を使用していますが脱出するためにスラッシュSEDが前方の代わりに任意の区切り文字を受け入れます。スラッシュ。)

../output.sh../../output.shに変換しますが、少なくともトリプルドットエラーは作成されません。

代わりに、perlのを試してみてください。

perl -pie '[email protected](?<!\.\./)(output\.sh\b)@../[email protected]' scriptName.sh 

これは、親の親に横断していないことを確認するために、負のルック背後を使用しています。 output.shelfのようなものがある場合は、\bを使って単語区切りを指定することもできます。

関連する問題