在perl的一行的通配符开头

时间:2013-06-27 09:45:19

标签: regex perl

如何使用通配符开头一行? 例如,我想将abc替换为def

这就是我的文件

     abc
    abc
abc
hg  abc

现在我希望abc只能在前3行中替换。怎么做?

$_ =~ s/['\s'] * abc ['\s'] * /def/g;

在第一个太空开始之前应该放什么条件?

由于

4 个答案:

答案 0 :(得分:2)

怎么样:

s/(^ *)abc/$1def/g

(^ *) - >行开头零或多个空格

这将严格用ab。

替换abc

另请注意,我使用的是真实空间,而不是\s,因为您说“第一个空格的开头”\s匹配的字符多于空格。

答案 1 :(得分:2)

你在正则表达式中犯了几个错误

$_ =~ s/['\s'] * abc ['\s'] * /def/g;
  • 如果您只想从字符串的开头替换(因为它只能匹配一次),您不需要/g全局,尽可能多次匹配)
  • 在字符类括号内,除]-^外,所有字符均为字面值,因此['\s']表示“匹配空格或撇号'”< / LI>
  • 正则表达式中的空格是按字面解释的,除非使用/x修饰符(它不是)
  • 量词适用于它们之前的任何内容,因此\s*表示“零个或多个空格”,但\s *表示“正好一个空格,后跟零个或多个空格”。同样,除非使用/x
  • 您不需要提供$_ =~,因为除非另有说明,否则这是任何正则表达式使用的变量。

如果您要替换abc,并且仅当abc替换为行中的第一个非空格时,您可以执行以下操作:

s/^\s*\Kabc/def/

\K(保持)转义的替代方法是捕获并放回

s/^(\s*)abc/$1def/

如果要将空格保留在目标字符串abc之后,则无需执行任何操作。如果您要删除它,只需在末尾添加\s*

s/^\s*\Kabc\s*/def/

另请注意,这只是将逻辑压缩为一个语句的一种方法。您也可以通过使用非常简单的构建块来实现相同的目标:

if (/^\s*abc/) {    # if abc is the first non-whitespace
    s/abc/def/;     # ...substitute it
}

由于替换只发生一次(如果未使用/g修饰符),并且只有第一个匹配受到影响,这将完美地替换abc def

答案 2 :(得分:1)

试试这个:

$_ =~ s/^['\s'] * abc ['\s'] * /def/g;

如果您需要从一行开始检查,请使用^

另外,我不确定为什么你的正则表达式中有'和空格。这对你也有用:

$_ =~ s/^[\s]*abc[\s]*/def/g;

答案 3 :(得分:1)

使用^字符,删除不必要的撇号,空格和[ ]

$_ =~ s/^\s*abc/def/g

如果你想保留那些在“abc”之前的空格:

$_ =~ s/^(\s*)abc/\1def/g