我需要搜索并替换正则表达式。实际上这一行:
^/httpd/$ (some chars here)
必须替换为
^/httpd$ (value of a variable named VAR)
因此我使用了这个:
perl -pi -e "s[^\Q^/httpd$\E(.*)$][\Q^/httpd$\E ${VAR}]" /file.conf
但没有任何事情发生..
答案 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