開始パターンと終了パターンを使用した複数行の接続

開始パターンと終了パターンを使用した複数行の接続

次のファイルがあります。

method AAA one (1,111):
   some_text_1
method BBB two (2,
   222):
   tuesday
method CCC three (3,
    333):
   sunny_day
method DDD four (4,
    444_a,
    444_b):
   last_week

私はそれが次のように見えるようにしたいです:

method AAA one (1,111):
   some_text_1
method BBB two (2,222):
   tuesday
method CCC three (3,333):
   sunny_day
method DDD four (4,444_a,444_b):
   last_week

ほとんどそのようなことをするsedコマンドがあります:

sed -i '/method/,/):/ p; :a; N; $!b a; s/\n\s\{1,\}//g' file.txt

次の出力が提供されます。

method AAA one (1,111):
method AAA one (1,111):some_text_1
method BBB two (2,222):tuesday
method CCC three (3,333):sunny_day
method DDD four (4,444_a,444_b): last_week

答え1

に基づいてSed 1行コマンドの詳細な説明、パート1:ファイル間隔、番号付け、テキスト変換および置換39. 行がバックスラッシュ「\」で終わったら、次の行に追加します。ただし、バックスラッシュをコンマに変更し、次のスペースを含むように置換を展開します。

$ sed -e :a -e '/,$/N; s/,\n[[:blank:]]*/,/; ta' file
method AAA one (1,111):
   some_text_1
method BBB two (2,222):
   tuesday
method CCC three (3,333):
   sunny_day
method DDD four (4,444_a,444_b):
   last_week

答え2

そしてawk

awk 'f{sub(/^[[:space:]]+/, "")} {f=/,$/; ORS = f ? "" : RS} 1'

f行が終わるたびにフラグを設定します,。フラグによっては、出力レコード区切り文字は空の文字列であるか、入力レコード区切り文字と同じです(デフォルトは改行)。このフラグが設定されるたびに、次の行の先頭の空白文字も削除されます。


の場合、perl入力が単一の文字列として扱えるほど小さいと仮定します。

perl -0777 -pe 's/,\n\s*/,/g'

次の行が関数の一部では,ない場合、上記の回避策は失敗します。methodこの場合、()部品に文字ペアしかないと仮定すると、method次のものが使用できます。

perl -0777 -pe 's/method[^(]+\([^)]+\)/$&=~s|\n\s*||gr/ge'

これは最初の文字から文字まで一致しmethod[^(]+\([^)]+\)ます。置換部分には、一致部分で動作して改行文字とオプションの空白文字を削除する別のPerlコードがあります。method()

答え3

使用gawk:

awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a $0; a=""}1' file

行末でカンマが見つかるたびに、変数はa現在の入力レコード($0)、スペース、および前のレコードを保持します。このレコードに対する追加操作を防止します。つまり、nextコマンドの最後に印刷イディオムを使用すると、印刷は行われません。awk1

パターンが一致した後、次のレコードでは現在の$0=a $0;a="";入力レコード($0)がに設定され、a次にそれぞれ前の設定$0と変数のa設定がに設定されます""

この関数はdel_space()レコードの終わりを見つけ、次のレコードの先頭にあるスペースを置き換えます。,

カンマの後にスペースを入れるには、次のように変更する必要があります。

awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a FS $0; a=""}1' file

答え4

別のsed(POSIX):

sed ':a;/^method/!b;/[^:]$/N;s/[[:space:]]*\n[[:space:]]*/ /g;ta'
  • DEFタグ:a
  • IFパターン空間は次に終わりません。method
    • それでは最後までスキップしてください。b
  • ELSEで終わらない場合:
    • 次に、次の行を追加を使用しますN
  • spaces* + \n+ spaces*を次に変更してください。' '
    • 交換品があれば返品してください。:a
  • 印刷終了

同様の状況に対処する必要があります。

method XXX foo (8,
    888):
   bar,
   baz

method
HHH
bar
(
aa,
bb):
    lor

パラメータの周りに少し余分なスペースが残ります。

関連情報