sed で \n を空白に、\n\n を \n に変更するには?

sed で \n を空白に、\n\n を \n に変更するには?

ファイルをプレーンテキストファイルにsed変換するために使用します。 srt` ファイルの形式は次のとおりです。srtAn

1
00:20:41,150 --> 00:20:45,109
line 1
line 2

2
00:21:41,150 --> 00:21:45,109
line 3
line 4

そのため、次のコマンドを使用してテキスト以外の行を削除しました。

sed -r '/^[0-9]+$/{N;d}' file.srt > file.txt

生産する

line1
line2

line3
line4

しかし、私は得たいです。

line1 line2
line3 line4

(各字幕セグメントを1行で表示)

どうすればいいですか?

答え1

これを使用してスキーマを取得します。

sed ':begin;$!N;s/\n/ /;tbegin' file.txt | sed 's/  /\n/g'

答え2

「短絡モード」で操作してこれを行うことができる必要がありますawk(たとえば、@EdMortonのソリューションを参照)。ここそして、「最初のフィールドを除くすべてのフィールドを印刷する」問題に対する解決策スタックオーバーフローで)

awk -v RS= -F'\n' '{$1=$2=""; print $0}' file.srt > file.txt

これは、「空行」で区切られたテキストブロックを、フィールドがテキストブロックの個々の行である入力レコードとして解釈します。これにより、上記のコマンドは最初の2つのフィールド(=行)を「空の」文字列に置き換えて行全体を印刷します。

「実際の出力」の前には、2つのスペース(出力フィールド区切り文字)が残ります。これが問題の場合は、-internalループを使用して残りのフィールドのみを明示的に印刷できますawk

awk -v RS= -F'\n' '{for (i=3; i<NF; i++) printf("%s ",$i); printf("%s\n",$NF)}' file.srt > file.txt

関連情報