如何使用通配符开头一行?
例如,我想将abc
替换为def
。
这就是我的文件
abc
abc
abc
hg abc
现在我希望abc
只能在前3行中替换。怎么做?
$_ =~ s/['\s'] * abc ['\s'] * /def/g;
在第一个太空开始之前应该放什么条件?
由于
答案 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