2017-01-25 5 views
1

私はthisを投稿しました。 sedの行を修正して正しい行を見つけることを避けるために、それ自体を修正するスクリプトに関するもので、すべて[]をsed正規表現の内部に入れるというトリックでうまくいきました。bashスクリプトのためのsedパズル

これはよく似ていますが、もう少し複雑です。他の投稿では、検索する行は静的であった。今度は、その行にいくつかのオプションがあります。

#!/bin/bash 
possible_locations=(
      "/somewhere/path/" 
      "/another/different/path/" 
      #Custom location (set=0) 
      ) 
#Here goes my sed line 

そして、他の回のコードは次のとおりです:

#!/bin/bash 
possible_locations=(
      "/somewhere/path/" 
      "/another/different/path/" 
      "/other/one/path/" #Custom location (set=1) 
      ) 
#Here goes my sed line 

タブのインデントに保ち、目だから、時にはコードは、このようにしている(「設定= X」でラインを見て)ラインの始めに。

私が望むのは、sed行そのもの(他のポストのようなもの)にマッチさせずに、この(set = x)行を両方で置き換えることなく、スクリプト自体を(sed -iを使って)正規表現で修正することです用例:

  "/new/path/" #Custom location (set=1) 

だから私は時々だけ#Custom location (set=0)と時々私はなど、グループをキャプチャさまざまな組み合わせを試してみました"/new/path/" #Custom location (set=1)

ため"/other/one/path/" #Custom location (set=1)を持っています(同じタブのインデントを維持する)ラインを交換したい...しかし、それを動作させることはできません。私は非常に近いと思う!ここに私の非稼働sedの行は次のようになります。

sed -i "s/^\(.*\)#[C]ustom location (set=[0-1])/\1\"\\/new\\/path\\/\" #Custom location (set=1)/" "/path/to/this/script.sh" 2> /dev/null

答えて

1

あなたがスペースに&タブを保存し、次を使用することができます。

  • (\s+|\t+)試合:次のグループを使用しています

    NEW_PATH=\"/new/path/\" 
    
    sed -ri "s_(\s+|\t+)([^ ]*)(\s*#Custom location \(set=)([0-9]+)(\))_\1$NEW_PATH \31\5_" test.conf 
    

    任意のスペースまたはタブ

  • ([^ ]*) matc
  • (\s*#Custom location \(set=)がセットされるまでコメントと一致した(存在する場合、 "path_string" 用)のスペースが、HESの何も=
  • ([0-9]+)
  • (\))が終了)

に置き換えグループ化されている\1$NEW_PATH \31\5(一致した設定値と一致しました1はsetの値に使用されます)

$NEW_PATHの変数の後に追加のスペースを追加しました。ケースnはスペースなしの存在コメントの前にあり°1

また、私はそれが正確に...いくつかの奇妙なスペースが表示されていませんでした/

+1

$NEW_PATHさんと競合する代わりに/_ SEDのセパレータを使用していることに注意してくださいあなたの正規表現で、しかしあなたは正しい方法で私に指摘しました。 'sed -ri 's:(\ s + | \ t +)([\" 0-9a-zA-Z/\ -_] +)?\ s?(1)/ new/path/\ "\ 31 \ 5:" "/path/to/this/script.sh" 2>/dev/null'。私は区切り文字を ':'に変更しました。 '_'をディレクトリ名として使うことができるからです。スペースと同じですので、正規表現を少し調整しました。 – OscarAkaElvis

関連する問題