-1

次のようなコードがあります。

void main() {
//----------
  var a;
  var b;
  var c =[];
  var c = func(3);
  if (a == b) {
    print "nested";
  }    
//----------------
}

ブラケットの間の内側の部分を選択したい、これは私が試したことです:

sed -re ':l;N;$!tl;N;s!(void \w+\(\) \{)([^])*!\1 Prepend;\n\2\nappend!g' test.txt

編集:

{の最初の出現の後、最後の出現の前にコードを挿入しようとしています}

例:

void main() { 
test1
//-----------------
  var a;
  var b;
  var c =[];
  var c = func(3);
  if (a == b) {
    print "nested";
  }
test2
//-----------------
}
4

4 に答える 4

3

あなたが実際にやりたいことawkに対するより良い解決策だと思います:

$ awk '/{/{i++;if(i==1){print $0,"\ntest1";next}}{print}/}/{i--;if(i==1)print "test2"}' file
void main() { 
test1
//-----------------
  var a;
  var b;
  var c =[];
  var c = func(3);
  if (a == b) {
    print "nested";
  }
test2
//-----------------
}

説明:

これは、いくつかの説明コメントを含む複数行形式のスクリプトです。この形式でそれを好む場合は、ファイルに保存して、次のnestedcodeように実行しawk -f nestedcode code.cます。

BEGIN{
    #Track the nesting level 
    nestlevel=0
}
/{/ {
    #The line contained a { so increase nestlevel
    nestlevel++
    #Only add code if the nestlevel is 1
    if(nestlevel==1){
        #Print the matching line and new code on the following line
        print $0,"\ntest1"
        #Skip to next line so the next block 
        #doesn't print current line twice
        next
    }
}
{
    #Print all lines
    print
}
/}/ {
    # The line contained a } so decrease the nestlevel
    nestlevel--
    #Only print the code if the nestleve is 1
    if(nestlevel==1)
        print"test2"
}
于 2013-01-08T08:11:43.867 に答える
2

これはうまくいくかもしれません(GNU sed):

sed '/^void.*{$/!b;:a;/\n}$/bb;$!{N;ba};:b;s/\n/&test1&/;s/\(.*\n\)\(.*\n\)/\1test2\n\2/' file
  • /^void.*{$/!b行が救済で始まりvoid、救済で終わらない場合{(これは、独自のニーズに合わせて調整する必要がある場合があります)。
  • :a;/\n}$/bb;$!{N;ba}行に改行の後に}のみが続く場合は、 label に分岐します。bそれ以外の場合は、次の行で読み込まれ、 label にループバックしaます。
  • :bここで置換を開始します。
  • s/\n/&test1&/最初の改行の後に最初の文字列を挿入します。
  • s/\(.*\n\)\(.*\n\)/\1test2\n\2/最後の改行から 2 番目の後に、2 番目の文字列を挿入します。
于 2013-01-08T13:06:28.847 に答える
-1

この正規表現を試してください:

{[^]*} // [^] = any character, including newlines.

正規表現が機能する JavaScript の例:

var s = "void main() {\n//----------\nvar a;\nvar b;\nvar c =[];\nvar c = func(3);\n//----------------\n}"
console.log(s.match(/{[^]*}/g));
//"{↵//----------↵var a;↵var b;↵var c =[];↵var c = func(3);↵//----------------↵}"

(これは JS の質問ではないことはわかっていますが、正規表現が目的の結果を返すことを示すために機能します。)

于 2013-01-08T07:59:56.960 に答える
-1

sed、デフォルトでは、単一行で動作します。コマンドを使用して複数の行をNパターン スペースに読み込むことにより、複数の行を操作できます。

たとえば、次の sed 式は、ファイル内の連続する行を@記号で結合します。

sed -e '{
N
s/\n/ @ /
}'

( http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-multi-line-file-operation-with-6-practical-examples/の例)

于 2013-01-08T08:00:20.470 に答える