我有一个非常大的 sql 文件,无法在 GUI 编辑器中打开。我需要用 'user2'@'localhost' 替换字符串 'user1'@'localhost'(注意 ` 字符),但我找不到 sed 命令的正确语法。
我可以使用以下 grep 命令正确替换字符串:
grep -w 'user1`@`localhost'
有什么帮助吗?谢谢。
答案1
我想到了一个比你的问题所要求的更通用的解决方案。
假设您需要根据正则表达式搜索条件查找一个字符串。您只想替换其中的一部分,而其他匹配的部分保持不变。
举个例子来说明:
echo "'some-name'@'some-host'" | sed -r "s/(')([^']+)('@'[^']*')/\1user2\3/g"
将显示:
'user2'@'some-host'
该sed
命令使用语法执行替换s/search-regexp/replacement/g
。在我们的例子中:
(')
匹配第一个单引号。这很简单,但可能更复杂。它表示替换之前的字符串部分。sed
将此子表达式的值分配给特殊变量\1
。([^']+)
匹配用户名。基本上从前一个位置开始的任何非引号字符。sed
将此子表达式的值分配给特殊变量\2
。('@'[^']*')
匹配'@'host-name'
部分。与上一个子表达式类似,一个引号,一个@
,再次是一个引号,以及任何非引号的字符,最后是一个引号。sed
将此子表达式的值分配给特殊变量\3
。
替换部分将替换与搜索正则表达式匹配的任何内容。通过使用上面显示的变量,我们可以替换用户名并保持其他区域不变。\1
+您的新用户名+\3
将产生所需的结果。因此:
\1user2\3
结果是:
- 第一个子表达式包含的内容(它是一个单引号)
- 后面跟着字符串“user2”,(注意
\2
是故意没用的,因为我们替换了用户名) - 最后是第三个子表达式的内容(
'@
引号中的和主机名)。
如果您cat
将脚本文件传递给sed
命令,您应该会得到所需的结果。
答案2
将 sed 命令包裹在引号周围将会起作用:
加法器@adamj-T1500:~$ cat sed_test 用户1'@'localhost 加法器@adamj-T1500:~$ sed -i -e "s/user1'@'localhost/user2'@'localhost/" sed_test 加法器@adamj-T1500:~$ cat sed_test 用户2'@'localhost
有多种不同的方法可以转义sed
命令中的单引号,stackoverflow 上有许多问题及其答案:
https://stackoverflow.com/questions/9112157/escaping-single-quotes
https://stackoverflow.com/questions/7990750/escape-single-quote
https://stackoverflow.com/questions/7517632/how-do-i-escape-double-and-single-quotes-in-sed-bash