次のファイルがあります。
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
コマンドの最後に印刷イディオムを使用すると、印刷は行われません。awk
1
パターンが一致した後、次のレコードでは現在の$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
パラメータの周りに少し余分なスペースが残ります。