如果使用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> ) ){
.
.
.
答案 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*#/;
。
/^\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文件中带#的所有行,而不需要手动遍历文本的每一行。