【问题标题】:RegEx for replacing new lines用于替换新行的正则表达式
【发布时间】:2019-05-21 16:41:03
【问题描述】:

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

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

我也试过这个:

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

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

【问题讨论】:

标签: regex linux bash awk sed


【解决方案1】:

给定这个输入文件:

$ 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 for -z 将整个文件作为一个字符串读取,-E 启用 ERE,并接受 \n 作为正则表达式中的换行符:

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

请注意,awk 解决方案除了可移植地与任何 UNIX 机器上的任何 shell 中的任何 awk 一起工作外,一次只读取/存储一个输入行,因此对于任意大的文件(而不是将整个文件读入内存的 sed 解决方案,对于大文件则使用 YMMV)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多