現在、単純なテキストファイルを解析するための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がないことを意味するので、追加します。