在正则表达式匹配之前删除换行符\换行符

在正则表达式匹配之前删除换行符\换行符

我目前正在编写一个 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

编辑: 这对我有用。但文本文件需要是unix文本文件而不是DOS文件

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,所以我们添加它。

相关内容