正则表达式查找包含特定字符的行并删除该行

5
我有一个文本文件,里面有很多字符条目,每行一个。 我想找到所有以::开头的行,并删除这些行。 正则表达式是什么? -AD

你正在使用哪种编程语言? - Alan Moore
7个回答

8

正则表达式本身并不会执行任何操作,只能用来匹配文本。

你需要的是一些工具,它们使用正则表达式来识别行,并对这些工具应用一些命令。

其中一个这样的工具是 sed(还有 awk 和许多其他工具)。你可以像这样使用它:

sed -e "/^::/d" < input.txt > output.txt

代码中的"/^::/"部分告诉sed应用以下命令到所有以"::"开头的行,"d"表示删除该行。

或者最简单的解决方案(我的大脑出了点问题,没有想到):

grep -v "^::" input.txt > output.txt

我认为你忘记了Regex.Replace函数...它实际上是有作用的,不是吗? - Dscoduc
@Dcoduc:就像你所说的:该函数执行某些操作(这是我提到的工具之一)。正则表达式本身仍然只匹配一些文本。函数的语义定义了对匹配文本的处理方式。 - Joachim Sauer

2
sed -i -e '/^::/d' yourfile.txt

我认为这可能是最好的答案,但值得一提的是,并非所有版本的sed都具有-i选项。 - oylenshpeegul

1
^::.*[\r\n]*

如果您逐行读取文件,则不需要使用[\r\n]*部分。


0

简单如下:

^::

0

感谢您的指引:

以下方法对我有效。在 "::" 后面,文本文件中可能存在任何字符,因此我使用了以下正则表达式:

^::[a-zA-Z0-9 我将所有标点符号都放在这里]*$

-AD


在你的例子中,由于你在结尾处加上了 $,所以你不得不“考虑”所有字符。 - Manu
如果他正在使用像grep这样的行定向工具,你是正确的。但他仍然没有说。 - Alan Moore
@ goldenmean,是什么阻止你使用.*而不是那个巨大的字符类呢? - Alan Moore
我同意,最好使用单行选项并将 .* 添加到表达式中。 - Dscoduc
单行模式?你为什么想让点匹配换行符呢?如果你一次读取一行,就不会有任何换行符需要匹配,如果你在处理之前将整个文件读入内存,则点星将在第一次应用时消耗掉文件的其余部分。 - Alan Moore

0

如果您没有sed或grep,请查找此内容并替换为空字符串:

^::.*[\r\n]

0

这是我的C#贡献:

文本流:

string stream = :: This is a comment line

语法:

Regex commentsExp = new Regex("^::.*", RegexOptions.Singleline);

使用方法:

Console.WriteLine(commentsExp.Replace(stream, string.Empty));

或者,如果我想要简单地拿取一个包含注释的文本文件,并产生一个去除注释行的精确副本,我可以使用 type 和 findstr 命令行工具的简单而有效的组合:

type commented.txt | findstr /v /R "^::" > uncommented.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接