英文:
sed is not working with certain string characters
问题
我一直在阅读各种Sed问题,有一个问题我无法解决:
我想替换:
define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);
为
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306\civicrm_uat_logs);
这几乎能工作...
sed -i -e "s/define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);/define('CIVICRM_LOGGING_DSN', 'myuser:mypassword@localhost:3306\civicrm_uat_logs');/" /my_path/civicrm.settings.php
输出是:
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306 vicrm_uat_logs);
问题是我缺少'ci'。我认为这是因为反斜杠,但为什么是两个字符呢?!如果我用'my_database'代替civicrm_uat_logs,我只会失去反斜杠。
无论如何,我似乎无法转义反斜杠,但也许还有别的事情在进行?
对这个问题感到困惑,但这应该很简单...
我用的是Ubuntu 22.04 LTS
更新:
我意识到我需要在数据库字符串周围加上引号... 所以替换应该是:
define('CIVICRM_LOGGING_DSN', 'myuser:mypassword@localhost:3306\civicrm_uat_logs');
现在,没有东西被替换,但也没有错误...
英文:
I have been reading through the various sed issues and have one I cannot get to work:
I want to replace:
define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);
With
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306\civicrm_uat_logs);
This almost works...
sed -i -e "s/define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);/define('CIVICRM_LOGGING_DSN', 'myuser:mypassword@localhost:3306\civicrm_uat_logs');/" /my_path/civicrm.settings.php
The output is:
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306 vicrm_uat_logs);
The issue is I get is that missing 'ci'. This, I assume is due to the backslash, but why two chars?! If I had 'my_database' instead of civicrm_uat_logs , I'd just lose the backslash.
I cannot seem to escape the backslash no matter, but maybe something else is going on?
Struggling with this one, but it must be simple...
I'm on Ubuntu 22.04 LTS
UPDATE:
I realsed that I needed quotes around the database string... so the replacement should be:
define('CIVICRM_LOGGING_DSN', 'myuser:mypassword@localhost:3306\civicrm_uat_logs');
Now,nothing get's replaced but no error...
答案1
得分: 1
好的,借助一位友善而知识丰富的朋友的帮助。Shell 和 sed 是嵌套的,所以:
sed -i -e "s/define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);/define('CIVICRM_LOGGING_DSN', 'civicrm:civicrm@db:3306\\civicrm_uat_logs');/"
转义了反斜杠和 '\c'。
英文:
OK, with the help of a kind and knowledgeable friend. The shell and sed are nested so:
sed -i -e "s/define('CIVICRM_LOGGING_DSN', CIVICRM_DSN);/define('CIVICRM_LOGGING_DSN', 'civicrm:civicrm@db:3306\\\\civicrm_uat_logs');/"
Escaping both the backslash and the '\c'
答案2
得分: -1
使用 `sed`
$ sed -E "s/([^,], )./\1myuser:mypassword@localhost:3306\\civicrm_uat_logs);/" input_file
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306\civicrm_uat_logs);
英文:
Using sed
$ sed -E "s/([^,]*, ).*/myuser:mypassword@localhost:3306\\\civicrm_uat_logs);/" input_file
define('CIVICRM_LOGGING_DSN', myuser:mypassword@localhost:3306\civicrm_uat_logs);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论