sed 命令用 ' 字符替换文本

sed 命令用 ' 字符替换文本

我有一个非常大的 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

相关内容