0

如何使用通配符作为行首?例如,我想abcdef.

这就是我的文件的样子

     abc
    abc
abc
hg  abc

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

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

在第一个空格开始之前要放置什么条件?

谢谢

4

4 回答 4

2

关于什么:

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

(^ *)-> 行首有零个或多个空格

这将严格用 def 替换 abc。

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

于 2013-06-27T09:49:47.323 回答
2

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

$_ =~ s/['\s'] * abc ['\s'] * /def/g;
  • 如果您只想从字符串的开头替换(因为只能匹配一次),则不需要/gglobal , match as many times as possible)。
  • 在字符类括号内,所有字符都是文字,除了],-^, 所以['\s']表示“匹配空格或撇号'
  • 正则表达式中的空格按字面意思解释,除非/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.

于 2013-06-27T10:51:27.117 回答
1

试试这个:

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

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

另外,我不确定为什么您'的正则表达式中有空格。这也应该为您工作:

$_ =~ s/^[\s]*abc[\s]*/def/g;
于 2013-06-27T09:48:51.213 回答
1

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

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

如果要保留“abc”之前的那些空格:

$_ =~ s/^(\s*)abc/\1def/g
于 2013-06-27T10:00:30.530 回答