3

一致するものが見つかった場合、sedまたはを使用して前の行に追加できますか?awk

次の形式のファイルがあります:

          INT32
          FSHL (const TP  Buffer)
             {
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

私がやろうとしているのは、独立した中括弧{をスキャンして、前の空白以外の行に追加することです。同じ行に何かが追加された中括弧は一致しないはずです。

期待される出力:

           INT32
          FSHL (const TP  Buffer){
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

返信ありがとうございます。

4

4 に答える 4

7

これはあなたのために働くかもしれません(GNU sed):

sed '$!N;s/\n\s*{\s*$/{/;P;D' file

説明:

  • $!N最後の行が次の行をパターンスペースに追加しない限り。
  • s/\n\s*{\s*$/{/改行の後に空白がないか、または任意の量の空白が続き、開いている中括弧が続き、文字列の終わりまで空白がないか、または任意の量の空白が、開いている中括弧で置き換えられます。
  • P最初の改行までを印刷します。
  • D最初の改行までを削除します(そうであれば、新しいサイクルを開始しないでください)。
于 2012-07-23T10:06:00.007 に答える
2

を使用する1つの方法perl。すべてのファイルをslurpモードで読み取り、正規表現を使用して中括弧のみで行を検索し、先頭のスペースを削除します。

perl -ne '
    do {
        local $/ = undef;
        $data = <>;
    };
    $data =~ s/\n^\s*(\{\s*)$/\1/mg;
    print $data
' infile

infile質問の内容を想定すると、出力は次のようになります。

FSHL (const TP  Buffer){
INT32
FSHL_lm (const TP  Buffer)
{ WORD32 ugo = 0; ...
于 2012-07-23T10:20:04.077 に答える
2

使用する1つの方法awk

awk '!(NF == 1 && $1 == "{") { if (line) print line; line = $0; next; } { sub(/^[ \t]+/, "", $0); line = line $0; } END { print line }' file.txt

または複数の行に分割:

!(NF == 1 && $1 == "{") { 
    if (line) print line
    line = $0
    next
}

{
    sub(/^[ \t]+/, "", $0)
    line = line $0
}

END {
    print line
}

結果:

INT32
          FSHL (const TP  Buffer){
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

HTH

于 2012-07-23T11:23:18.950 に答える
0

[shyam @ localhost〜] $ perl -lne's / ^ / \ n /if$。>1&& / ^ \ d + /; printf "%s"、$ _'appendDateText.txt

それはうまくいくでしょう

i / p:

2016年6月12日20:30テストテストテスト

TestTest

2019年6月12日20:30abbsabcbcb abcbc

2016年6月11日20:30テストテスト

i123312331233123312331233123312331233123312331233テスト

2016年6月12日20:30abc

o / p:

2016年6月12日20:30テストテストTestTestTest

2019年6月12日20:30abbsabcbcb abcbc

2016年6月11日20:30テスト##testi123312331233123312331233123312331233123312331233テスト

于 2017-10-05T12:29:59.913 に答える