正则表达式用于替换新行

时间:2019-05-21 16:41:04

标签: regex linux bash awk sed

我试图替换第二行不是以数字字符开头的换行符,我使用了这句话:

perl -pe 's/\n/ / if m/\n[^0-9]/' *.txt

我也尝试过这个:

sed -r 's/\n([^0-9])/\1/g' *.txt

命令提示符仅显示整个文件,但没有做任何更改,我在做什么?

2 个答案:

答案 0 :(得分:2)

提供此输入文件:

$ cat file
1
2
foo
bar
3
etc
4
5

任何awk:

$ awk '{printf "%s%s", (/^[0-9]/ ? ors: ""), $0; ors=ORS} END{print ""}' file
1
2foobar
3etc
4
5

使用GNU sed来-z将整个文件读取为一个字符串,-E启用ERE,并接受\n作为正则表达式中的换行符:

$ sed -Ez 's/\n([^0-9])/\1/g' file
1
2foobar
3etc
4
5

请注意,awk解决方案除了可在任何UNIX盒上的任何shell中可移植地使用任何awk之外,一次仅读取/存储一个输入行,因此对于任意大文件(相对于sed解决方案,它将整个文件读入内存,因此YMMV用于读取大文件。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed ':a;N;s/\n\([^0-9]\)/\1/;ta;P;D' file

在文件的整个长度上打开一个两行窗口,如果窗口的第二行不是以整数开头,请删除前面的换行并重复。