【问题标题】:Perl Regular Expressions + delete line if it starts with #Perl 正则表达式 + 删除以 # 开头的行
【发布时间】:2017-02-02 06:01:43
【问题描述】:

如何使用 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> ) ){

.
.
.

【问题讨论】:

    标签: perl


    【解决方案1】:

    您不会删除带有s/// 的行。 (在一个循环中,你可能想要next;

    在您发布的 sn-p 中,它将是:

    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 次或多次”
    • # - 只是一个#

    【讨论】:

    • 但是这个语法怎么删行呢?
    • 可能是这样 $line =~ s/^\s*#//s; ?
    • @jennifer 更新了答案。 (s/^\s*#// 匹配该行,但不会删除 - 它会用空行​​替换该行。)
    • @grawity 它不起作用我也写 if (/^\s*#/) { print $line; } 查看注释行但不打印注释行?
    • @jennifer:如果你把它放在next; 的下面,那么它就会被跳过。请改用if (...) { next; } else { print $line; }
    【解决方案2】:

    基于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
    

    【讨论】:

      【解决方案3】:

      程序(剪切和粘贴整个东西,包括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
      

      【讨论】:

        【解决方案4】:
        $text ~= /^\s*#.*\n//g
        

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

        【讨论】:

        • 如果读取整个文件,则不会完全起作用,因为^ 指的是文件的开头,而不是行的开头。这对我有用:$text =~s/(^|\n)\s*#[^\n]*//g;(小警告:如果第 1 行有评论,则会有一个过时的换行符)
        猜你喜欢
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        相关资源
        最近更新 更多