2017-01-03 1 views
0

の2番目の発生一致SED:質問更新パターン

$Subj .= "HAD PROBLEMS"; 

    if ($To) { 
     $Cc = "abc\@example.com"; 
    } 
    else { 
     $Cc = "abc\@example.com"; 
    } 

をIは、下記のいずれかの形式のコードのブロックを含むファイルを有します2.

$Subj .= "HAD PROBLEMS"; 

    if ($To) { $Cc = "abc\@example.com"; } else { $Cc = "abc\@example.com"; } 

$ Cc変数(2回目)のメールIDを新しいemに置き換える必要があります両方のフォーマットのail id。

私はそうするために次のsedコマンドを持っています。

sed '\|HAD PROBLEMS|,/}/ s/$Cc = \(\"[A-Za-z0-9]*\)\(.*\)\([A-Za-z0-9]*\)\@example.com\"/\$Cc = "new email\\@example.com"/' test.txt 

このコマンドは、私の終了マッチパターンから{}ブロック($Ccの最初の出現)がある場合は、「}」で$Cc変数に電子メールIDを交換します。私は2番目の$CcのメールIDを置き換えたいと思います。 '}'の2回目の出会いはどのように一致しますか?

以下の解決方法は、最初のフォーマットで使用できます。しかし、私はどちらのフォーマットにも対応する汎用ソリューションが必要です。誰でも助けてもらえますか?

私は説明がはっきりしていることを望みます。

+0

、適切な期待される出力とスクリプトの構文の問題を修正。 – Inian

+0

なぜ$ Toに関係なく$ Ccを同じ値に設定していますか?それはタイプミスですか? – codeforester

+2

@Inianでは、あなたのsedスクリプトは実際に両方のインスタンスを置き換えますが、それはOPが探しているものではありません。彼は 'HAS PROBLEMS'の後にある' if'の 'else'ブロックに現れる* 2番目のインスタンスだけを望みます。これはsedで表現できるものかもしれませんが、sedの保持スペースと 'x/s/[az] + \\ @ [az .-] +/new @ exampleのようなスニペットの使用が必要になるでしょう。 com/2; p'を実行すると、ファイルの重要な塊だけをsedの保持スペースに入れる方法がわかります。あまりにも夜遅く、それを理解するために、...救助のためのawk! – ghoti

答えて

0

awkはこの問題を表現するための明確な言語になりそうです。

awk '/HAD PROBLEMS/{x=1} /}/{x++} x==2&&/\$Cc =/{sub(/[a-z]+\\@[a-z.-]+/,"[email protected]"); unset x} 1' input.txt 

または、より簡単にするために間隔をあけコメント:あなたの入力は明らかではない

# search for your start pattern, set a counter. 
/HAD PROBLEMS/ {x=1}   

# increment the counter at the first close-squigly. 
/}/ {x++}     

# If we've done our increment and we're on the right line, 
x==2 && /\$Cc =/ {   
    # substitute the existing address with a new one, 
    sub(/[a-z]+\\@[a-z.-]+/,"[email protected]"); 
    # and reset our counter. 
    unset x 
} 

# Print the current line. 
1       
+0

これは私のために働く。しかし、私はその場で検索して置き換えなければなりません。私はawkバージョン3.1.5を実行しており、上記のコマンドでインプレースを実行することはできません。上記の回答のsed版がありますか?それは本当に役に立ちます。 – DND

+0

Sed inplaceは単にファイルを一時ファイルにコピーして名前を変更します。シェルラッパーでこれを自分で行うことができます。 'awk '/ HAD PR ...' file.txt>出力。$$ && mv出力。$$ file.txt' – ghoti

+0

これは動作しています。もう一度あなたからの助けが必要です。私は1行に似たようなコードを持っています。しかし、同じ解決法は機能しません。それは新しい行だけで '}'を探しますか?これで助けてもらえますか? $ Subj。= "問題があった"; if($ To){$ Cc = "xyz \ @ abc.com"; } else {$ Cc = "xyz \ @ abc.com"; } – DND

関連する問題