2016-06-21 9 views
2

ファイル内の一部の文字列を置換する必要がありますが、文字列が中括弧の中にある場合は、スキップする必要があります。これは、中括弧で包まれていない文字列の中だけのfooを検索する必要があり中括弧以外のファイル内の文字列を置換する

bar foo {foobar}bar {foo} 

sed -i '/[^{].*foo.*[^}]/ s/foo/bar/g' test.f 

テストファイルtest.fのようなものは次のようなものが含まれています。その結果は次のようになります。括弧内

bar bar {foobar}bar {foo} 

すべてが文字列が行に「{」が対応するまで無視されなければならない「}」で始まる、すなわちならば、無視されるべきです。

これはsedで実行する必要はありません。どうもありがとう。

サンプル入力:

bar foo {foobar}bar {foo} 
foo { foo { foo } foo } foo 
foo { foo } foo { foo } foo 

予想される出力:ちょうど楽しみのため

bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
+2

'bar {foo'や' foo} bar'のような文字列はどうすればよいですか? – choroba

+2

ネストされた括弧はどうなりますか? 'foo {foo {foo} foo} foo'と' foo {foo} foo {foo} foo'です。 – choroba

+1

上記のコメントで質問された内容で質問を更新してください。質問そのものは現時点ではっきりしていません。 –

答えて

3
$ cat tst.awk 
{ 
    gsub(/foo/,RS) 
    numChars = length() 
    rec = "" 
    for (charNr=1; charNr<=numChars; charNr++) { 
     char = substr($0,charNr,1) 
     if (char == "{") { depth++ } 
     if (char == "}") { depth-- } 
     rec = rec ((char == RS) && (depth == 0) ? "bar" : char) 
    } 
    gsub(RS,"foo",rec) 
    print rec 
} 

$ awk -f tst.awk file 
bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
+1

これは正規表現ベースのソリューションの代わりに行く正しい方法です。++ – anubhava

+0

それは?さらに、gsub()は1行につき2回使用されます。 – hek2mgl

+0

1行に2回gsub()を呼び出すことは問題ありません。比較のために正規表現ベースのソリューションが提供されているかどうかを確認します。 –

0

awk '{sub(/foo/,"bar")}{sub(/ foo$/," bar")}{sub(/} foo {/,"} bar {")}1' file 
bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
関連する問題