2011-08-01 10 views
2

私は単語のすべての出現を置き換えようとしていますが、区切り文字のペアの中に置かれているときだけです。例:regex submatch replace

Original: asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf 
Desired: asdf oldfoo asdf ("asdf newfoo asdf newfoo asdf") asdf oldfoo asdf 

SEDまたはawkのでそれを行うにはどのような方法がありますか?

ありがとうございます!はい、前述@nobodyとして、それは

oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$) 

のようなもの

+0

チェックアウトこの質問:[サブ文字列内のダッシュとスペースを置き換えるために、正規表現を](http://stackoverflow.com/questions/6872705/regular-expression-to-replace-spaces-with-dashes -within-a-sub-string/6873023) – nobody

答えて

0

だ私はあなたがおそらくそれは、awkを/で正しく動作させるために"のビットをエスケープしてプレイする必要がありますね場合

をセッド 申し訳ありません[OK]を、私はSED/awkは全く先読み/後読みをサポートしていないことを知りませんでした:あなたは

perl -pe 's/oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)/newfoo/g' whatever.txt 

EDITだろうperlの持っています。私は、少なくとも先読みなしでこの作業を行う方法がないことは恐れている。

2

区切り文字は、'("''")'と区切り文字のいずれか一方のみ発生している場合は、行ごとに発生します。

sed -e ':begin;s/\(.*(".*\)oldfoo\(.*").*\)/\1newfoo\2/;t begin' 

あなたが途中で'oldfoo'があることが起こる怒鳴るように、ラインごとに複数の出現を持っている場合、それは動作しません。外側の区切り文字の内側:

asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf 

あなたの区切り文字は'('')'している場合、これはあなたが行ごとに複数の区切り文字を持っている場合でも動作します:

sed -e ':begin;s/\(.*([^)]*\)oldfoo\([^(]*).*\)/\1newfoo\2/;t begin'