Perl正则表达式+删除行,如果它以#开头

时间:2010-11-07 09:28:35

标签: perl

如果使用Perl正则表达式以“#”字符开头,如何删除行?

例如(需要删除以下示例)

line="#a"
line="     #a"
line="# a"
line="    # a"

...

所需的语法

   $line =~ s/......../..

或如果行以“#”开头,​​则跳过循环

来自我的代码:

open my $IN  ,'<', $file      or die "can't open '$file'  for reading: $!";
while( defined( $line = <$IN> ) ){

.
.
.

4 个答案:

答案 0 :(得分:12)

您不会删除s///行。 (在循环中,您可能需要next;

在您发布的代码段中,它将是:

while (my $line = <IN>) {
    if ($line =~ /^\s*#/) { next; }
    # will skip the rest of the code if a line matches

    ...
}

可以缩短表单/^\s*#/ and next;next if /^\s*#/;


perldoc perlre

/^\s*#/
  • ^ - “行首”
  • \s - “空白角色”
  • * - “0次或更多次”
  • # - 只是#

答案 1 :(得分:4)

基于Aristotle Pagaltzis's answer你可以做到:

perl -ni.bak -e'print unless m/^\s*#/' deletelines.txt
  

这里,-n开关使perl在你提供的代码周围放置一个循环   它将读取您在命令行中传递的所有文件   序列。 -i开关(用于“就地”)表示收集输出   从您的脚本中覆盖每个文件的原始内容   它。 -i选项的.bak参数告诉perl保留备份   原始文件名以原始文件名命名的文件中   .bak追加。对于所有这些位,请参阅perldoc perlrun。

deletelines.txt(最初):

#a
b
     #a 
#   a
  c
         # a

变为:

b
  c

答案 2 :(得分:2)

程序(剪切和粘贴整个东西,包括DATA部分,调整shebang线,运行)

#!/usr/bin/perl
use strict;
use warnings;

while(<DATA>) {
  next if /^\s*#/;  # skip comments
  print;            # process data
}

__DATA__
# comment
data
  # another comment
more data

输出

data
more data

答案 3 :(得分:0)

$text ~= /^\s*#.*\n//g

这将删除整个$ text文件中带#的所有行,而不需要手动遍历文本的每一行。