Perl文字正则表达式

时间:2013-12-12 11:11:56

标签: regex perl

我需要搜索并替换正则表达式。实际上这一行:

^/httpd/$ (some chars here)

必须替换为

^/httpd$ (value of a variable named VAR)

因此我使用了这个:

perl -pi -e "s[^\Q^/httpd$\E(.*)$][\Q^/httpd$\E ${VAR}]" /file.conf

但没有任何事情发生..

2 个答案:

答案 0 :(得分:2)

您似乎对您是否拥有或希望在字符串中包含尾部斜杠感到困惑,例如: httpd/$httpd$。如果你有它并且没有把它放在正则表达式中,那就是它不匹配的原因。

但除此之外,尝试在Perl代码中的正则表达式中插入shell变量并不是一个好主意。您可以使用%ENV哈希,其中$VAR环境变量表示为$ENV{VAR}

至于\Q ... \E$,这似乎是一个两难选择。由于可以插入变量,因此您无法使用$\E,因为它将被解释为$\和文字E。你无法摆脱美元符号,因为\Q ... \E将逃避反斜杠。但是,您可以将美元符号放在转义之外并手动转义它,例如\E\$

您还可以使用\K转义来“保留”您不想删除的字符串部分。

因为您没有提供足够的信息,所以无法提供确切的答案,但我可以猜测。以下是我对你可能需要的猜测:

perl -pi -e 's[^\Q^/httpd/\E\$\K.*][ $ENV{VAR}]' /file.conf

或者更简单

perl -pi -e 's[^\^/httpd/\$\K.*][ $ENV{VAR}]' /file.conf

答案 1 :(得分:-1)

请尝试使用以下语法:

 perl -pi -e "s/\^\/httpd\/\\$.*/^\/httpd\\$ ${VAR}/" /file.conf

在最初的正则表达式中,缺少/。 shell解释$符号,因此perl不会在正则表达式中“看到”它。

演示

<强> file.conf

^/httpd/$ qsdfqsdfqsdfqsdf
^/httpd/$ qsdfqsdfqsdfqsdsdfgsdfgf
^/httpd/$ qsdfqsdfqsdfqszezezedf

<强> main.sh

#!/bin/bash

VAR=FOOBAR

echo BEFORE
more file.conf

perl -pi -e "s/\^\/httpd\/\\$.{0,}/^\/httpd\\$ ${VAR}/" file.conf

echo
echo
echo AFTER
more file.conf

echo
echo
echo 'done'

<强>输出

$bash -f main.sh 
BEFORE
::::::::::::::
file.conf
::::::::::::::
^/httpd/$ qsdfqsdfqsdfqsdf
^/httpd/$ qsdfqsdfqsdfqsdsdfgsdfgf
^/httpd/$ qsdfqsdfqsdfqszezezedf

AFTER
::::::::::::::
file.conf
::::::::::::::
^/httpd$ FOOBAR
^/httpd$ FOOBAR
^/httpd$ FOOBAR

done