使用sed将一段代码添加到my.cnf

我试图设置一个bash脚本来追加一些代码到/etc/mysql/my.cnf

 [mysqld] <-- new code needs to append here old code old code old code 

应该导致

 [mysqld] # set default collation collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 old code old code old code 

我已经尝试了以下,但它不起作用。

 #!/usr/bin/env bash echo "Set default collation to UTF-8 in /etc/mysql/my.cnf" sudo sed -i 'a\ # set default collation\ collation-server = utf8_unicode_ci\ init-connect='SET NAMES utf8'\ character-set-server = utf8\ ,/[mysqld]/d' /etc/mysql/my.cnf 

 sed '/\[mysqld\]/a # set default collation\ collation-server = utf8_unicode_ci\ init-connect='\''SET NAMES utf8'\''\ character-set-server = utf8\' /etc/mysql/my.cnf 

您可以使用append命令( a ),但需要它在正确的行上运行,即与/\[mysqld\]/ (该部分在开始时将sed操作限制为仅匹配行) 。

下一个棘手的部分是'\'' 。 基本上,如果你在单引号内,你不能逃避单引号。 你所能做的就是完成字符串(')。 然后,你在正常的bash上下文,所以你可以传递一个转义的单引号(\'),然后你开始你的下一个单引号字符串(')。 由于这些空格不是以空格隔开的,因此bash会将它们合并在一起,并将它们作为单个参数(sed命令参数)传递给sed。

至于bash脚本部分,你可以这样做:

 #!/bin/bash file="/etc/mysql/my.cnf" if [ -w "$file" ] #Check if you have write permissions then echo "Setting default collation to UTF-8 in /etc/mysql/my.cnf" sed '/\[mysqld\]/a # set default collation\ collation-server = utf8_unicode_ci\ init-connect='\''SET NAMES utf8'\''\ character-set-server = utf8\' -i "$file" else echo "Can't write to $file. ry running the script with 'sudo'." fi 

你可以使用这个:

 sed 's/\[mysqld\]/[mysqld]\ # set default collation\ collation-server = utf8_unicode_ci\ init-connect='\''SET NAMES utf8'\''\ character-set-server = utf8/' /etc/mysql/my.cnf 

完整的解决方案,在一个地方:

 #!/usr/bin/env bash file="/etc/mysql/my.cnf" if [ -w "$file" ] #Check if you have write permissions then echo "Setting default collation to UTF-8 in /etc/mysql/my.cnf" sed '/\[mysqld\]/a # set default collation\ collation-server = utf8_unicode_ci\ init-connect='\''SET NAMES utf8'\''\ character-set-server = utf8\' -i $file else echo "Can't write to $file. Try running the script with 'sudo'." fi 

你可以做:

 awk '/\[mysqld\]/ {$0=$0"\nnew data\nadd here"}1' file 

用您的数据:

 awk '/\[mysqld\]/ {$0=$0"\n# set default collation\ncollation-server = utf8_unicode_ci\ninit-connect="q"SET NAMES utf8"q"\ncharacter-set-server = utf8"}1' q="'" file [mysqld] # set default collation collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 old code old code old code 

由于awk代码中的单引号有些复杂,您可以将其添加到变量中,然后在代码中使用它。