正規表現の一致前に改行\改行を削除

正規表現の一致前に改行\改行を削除

現在、単純なテキストファイルを解析するためのbashスクリプトを作成しています。今私が経験している問題は、あってはならない新しい行が現れるということです。たとえば、

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im
Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

「Klassenverband」文字列が新しい行にあります。私はこれをしたくありません。新しい行文字を削除するには、sedとawkを使用して別のコマンドを実行してみました。

awk '/^\([a-zA-Z]\{4\}\)/{printf "%s ",$0;next} 1' file
sed '/^\([a-zA-Z]\{4\}\)/{N;s/\n//;}' file

今まで私が考えたことは、次の正規表現を使用して必要なすべての文字列を抽出できることです。

^\([a-zA-Z]\{4\}\)

私はこの結果を期待しています

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

編集する: これは私にとって効果的です。ただし、テキストファイルはDOSファイルではなくUnixテキストファイルである必要があります。

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ \1/; P;D' file

答え1

どうですか?

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ \1/; P;D' file
Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

答え2

の場合、perl入力ファイルがメモリに入るのと同じくらい小さいとします。

perl -0777 -pe 's/\n([a-zA-Z]{4})/ $1/g' file.txt

答え3

これは不器用です。おそらくより良い方法があります。

awk '{ c=""; if (NR!=1 && !/^[a-zA-Z]{4}/) { c="\n" }; printf("%s%s",c,$0) } END { print "" }' 

デフォルトでは各行を印刷します。いいえLFキャラクター。だから私たちはできますプレフィックスこの行をマージしたくない場合は、次の行にLFを追加してください。

最後に、これは最後の行に最後のLFがないことを意味するので、追加します。

関連情報