逃离美元符号

时间:2011-06-23 05:14:57

标签: sed awk grep

我在my.cnf文件中有一行

datadir = /var/lib/mysql

以下内容将其更改为mysql3307。

sed -i 's/\/var\/lib\/mysql$/\/var\/lib\/mysql3307/' /etc/my.cnf

但如果我有以下内容:

datadir = /var/lib/mysql/

然后以下内容不会按预期更改路径:

sed -i 's/\/var\/lib\/mysql\/$/\/var\/lib\/mysql3307/' /etc/my.cnf

我想更改mysql3307的路径,其中datadir是/ var / lib / mysql(带或不带/)

更新

以下是问题: 上述两个命令都可以在一台服务器上运行,但不能在另一台服务器上运行。

以下按预期工作,但我需要添加$来表示以mysql /

结尾的行
sed -i 's/\/var\/lib\/mysql\//\/var\/lib\/mysql3307/' /etc/my.cnf

观察到的:

carot sign ^按预期工作,但行尾符号$没有。任何线索?

更新

在使用" dos2unix"之后似乎正在工作。命令。

3 个答案:

答案 0 :(得分:2)

如果您的目的是仅更改具有该特定目录的路径,则需要更加棘手。您必须在没有尾随/的行尾处捕获它,并且您还必须在具有尾随/的任何地方捕获它(行尾与否)

但你不想抓住像/var/lib/mysqlplus这样的东西,因为那是一个完全不同的目录。

考虑使用扩展正则表达式,并使用不同的分隔符,因此命令看起来不像锯齿(/\/\/\/\/\/\/\/\)。通过这些更改,以及对正则表达式本身的一个小修改,它可以正常工作:

$ echo '
/var/lib/mysqlplus
/var/lib/mysql/
/var/lib/mysql
/var/lib/mysql/xyz' | sed -E 's|/var/lib/mysql([$/])|/var/lib/mysql3307\1|'

/var/lib/mysqlplus
/var/lib/mysql3307/
/var/lib/mysql
/var/lib/mysql3307/xyz

答案 1 :(得分:1)

使用$作为文字字符可能需要进行转义,但不能作为锚点来表示字符串的结尾。

顺便说一下,如果使用不同的分隔符,你的正则表达式会更容易阅读,所以你没有逃避正则表达式中的/

sed -i `'s|/var/lib/mysql/|/var/lib/mysql13307/|' /etc/my.cnf

答案 2 :(得分:0)

如果您只想更改datadir值,则以下命令更合理:
sed -i.bak 's| *datadir *=.*|datadir = /var/lib/mysql3306/|g' /etc/my.cnf

注意:-i.bak在进行更改之前,使用后缀.bak备份原始文件。