如何使用通配符作为行首?例如,我想abc
用def
.
这就是我的文件的样子
abc
abc
abc
hg abc
现在我希望abc
只在前 3 行中替换它。怎么做?
$_ =~ s/['\s'] * abc ['\s'] * /def/g;
在第一个空格开始之前要放置什么条件?
谢谢
关于什么:
s/(^ *)abc/$1def/g
(^ *)
-> 行首有零个或多个空格
这将严格用 def 替换 abc。
另请注意,我使用了真实空间,而不是\s
因为您说“第一个空间的开头”。\s
匹配比空格更多的字符。
你在你的正则表达式中犯了几个错误
$_ =~ s/['\s'] * abc ['\s'] * /def/g;
/g
(global , 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
.
试试这个:
$_ =~ s/^['\s'] * abc ['\s'] * /def/g;
如果您需要从行首开始检查,请使用^
.
另外,我不确定为什么您'
的正则表达式中有空格。这也应该为您工作:
$_ =~ s/^[\s]*abc[\s]*/def/g;
使用^
字符,并删除不必要的撇号、空格和[
]
:
$_ =~ s/^\s*abc/def/g
如果要保留“abc”之前的那些空格:
$_ =~ s/^(\s*)abc/\1def/g