Perlなどのツールを使用した複数行の編集

Perlなどのツールを使用した複数行の編集

.uncrustify.cfg読みやすくするためにファイルを編集しています。次のように再フォーマットしたいと思います。

2行:

# Add or remove between the parens in the function type: 'void (*x)(...)'
sp_after_tparen_close      = ignore   # ignore/add/remove/force

1行出力:

sp_after_tparen_close      = ignore   # ignore/add/remove/force#   Add or remove between the parens in the function type: 'void (*x)(...)'

Perlが最良の選択だったようですが、構文に圧倒されました。 10年の余裕があれば学びます ;-)

もっと一般化するには、次のようにします。

2行:

#a comment line
some code

1行出力:

some code # a comment line

==========================

John:手描きの2行:

nl_while_brace             = ignore   # I,A,R,F     # Add or remove newline between 'while' and '{'
nl_scope_brace             = ignore   # I,A,R,F     # Add or remove newline between 'scope (x)' and '{' (D)

...awkを使用せずに2つのペアを組み合わせました。

# Add or remove newline between 'unittest' and '{' (D)
nl_unittest_brace          = ignore   # I,A,R,F

# Add or remove newline between 'version (x)' and '{' (D)
nl_version_brace           = ignore   # I,A,R,F

ベストアンサー1

sed '/^#/N;s/\(.*\)\n\([^#].*\)/\2 \1/;P;D'

これは質問の簡単な例を扱います。コメントではなく、少なくとも1つの文字を含む行が続くすべてのコメント行は、その後の行に追加されます。

したがって、例を実行すると、出力は次のようになります。

sp_after_tparen_close      = ignore   # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'

@John1024の例を実行すると、出力は次のようになります。

#
# Some comments
#

sp_after_tparen_close      = ignore   # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'

some code #a comment line
more code

# comment one
# comment two
still more code # comment three

これらのケースを処理するためにsedループは必要ありません。この場合、\newline文字を含めることができる唯一の行は、ハッシュで始まる行です。なぜなら、この行に 1 が追加される#唯一の行だからです。sed

sedハッシュで始まる行に出会ったら、追加の入力行を取得#してNパターン空間に追加します。sed次に、次のs///ものを交換してみてください。

  • \(.*\)- できるだけ多くの引用を使用し、\1その後に...
  • \n- 改行文字が続きます...
  • \([^#].*\)- ハッシュ以外の文字が1つ以上あり、#パターン空間にすべてが残っています。
  • そして\2 \1

sed次に、P最初に表示される\newline文字までパターンスペースを印刷し、D同じ文字を削除して残りを再試行します。(そうであれば)

おすすめ記事