我在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"之后似乎正在工作。命令。
答案 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
备份原始文件。