正则表达式删除偶数行

时间:2010-02-12 07:53:03

标签: regex

我需要帮助来构建一个可以删除纯文本文件中的偶数行的正则表达式。

鉴于此输入:

  

LINE1
  LINE2
line3中
LINE4
LINE5
LINE6

它会输出:

  

LINE1
line3中
LINE5

谢谢!

6 个答案:

答案 0 :(得分:7)

实际上,你没有使用正则表达式。使用您喜欢的语言,迭代文件,使用计数器并执行模数。例如用awk(* nix)

$ awk 'NR%2==1' file
line1
line3
line5

偶数行:

$ awk 'NR%2==0' file
line2
line4
line6

答案 1 :(得分:2)

首先,我完全同意这是正则表达式应该做的事情。

这是一个Java演示:

public class Test {

    public static String voodoo(String lines) {
        return lines.replaceAll("\\G(.*\r?\n).*(?:\r?\n|$)", "$1");
    }

    public static void main(String[] args) {
        System.out.println("a)\n"+voodoo("1\n2\n3\n4\n5\n6"));
        System.out.println("b)\n"+voodoo("1\r\n2\n3\r\n4\n5\n6\n7"));
        System.out.println("c)\n"+voodoo("1"));
    }
}

输出:

a)
1
3
5

b)
1
3
5
7

c)
1

正则表达式的简短说明:

\G       # match the end of the previous match
(        # start capture group 1
  .*     #   match any character except line breaks and repeat it zero or more times
  \r?    #   match the character '\r' and match it once or none at all
  \n     #   match the character '\n'
)        # end capture group 1
.*       # match any character except line breaks and repeat it zero or more times
(?:      # start non-capture group 1 
  \r?    #   match the character '\r' and match it once or none at all
  \n     #   match the character '\n'
  |      #   OR
  $      #   match the end of the input
)        # end non-capture group 1

\G从字符串的开头开始。每对线(第二行是可选的,如果是最后一条不均匀的线)被对中的第一行替换。

但同样:使用普通的编程语言(如果可以调用awk“normal”:),就可以了。

修改

正如蒂姆所说,这也有效:

replaceAll("(?m)^(.*)\r?\n.*", "$1")

答案 2 :(得分:1)

好吧,如果你在

上进行搜索和替换所有匹配
^(.*)\r?\n.*

在“^匹配行开始模式”和“.与换行模式不匹配”​​;替换为

\1

然后你会失去每一条连线。

电子。 G。在C#中:

resultString = Regex.Replace(subjectString, @"^(.*)\r?\n.*", "$1", RegexOptions.Multiline);

或在Python中:

result = re.sub(r"(?m)^(.*)\r?\n.*", r"\1", subject)

答案 3 :(得分:0)

好吧,这将删除文本文件中的偶数行:

grep '[13579]$' textfile > textfilewithoddlines

并输出:

1行

第3行

LINE5

答案 4 :(得分:0)

也许你在命令行上。在PowerShell中:

$x = 0; gc .\foo.txt | ? { $x++;  $x % 2 -eq 0 }

答案 5 :(得分:0)

我在Sublime Text'regex-find-replace'模式下使用捕获组(。*)-> $ 1 删除每隔一行的换行符,并使用

在值之间放置一个制表符
replace (.*)\n(.*)\n
with $1\t$2\n

对于这个特定问题,OP可以将其更改为

replace (.*)\n(.*)\n
with $1\n