gpt4 book ai didi

sed - 逃避美元符号

转载 作者:行者123 更新时间:2023-12-04 19:34:20 25 4
gpt4 key购买 nike

我在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

观察到:

胡萝卜符号 ^ 按预期工作,但行尾符号 $ 不工作。有什么线索吗?

更新:

它似乎在使用“dos2unix”命令后工作。

最佳答案

如果您的意图是仅更改具有该特定目录的路径,则需要更巧妙一些。您必须在没有尾随 / 的行尾捕获它,并且还必须在它尾随 / 的任何地方捕获它(是否行尾)。

但是您不想捕获像 /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

关于sed - 逃避美元符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com