我目前正在编写一个 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,所以我们添加它。