2014-09-03 47 views
2

我想设置一个bash脚本的一些代码行追加到/etc/mysql/my.cnf追加的代码块与SED

[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 

我试图my.cnf文件以下,但它不起作用。

#!/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 
+0

请你为什么在每一行的在我的末尾添加反斜杠。 CNF? – 2016-08-07 13:46:39

回答

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

可以使用附加命令(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 
+0

这工作,但一点。我得到了整个文件,并在缓冲区中输出了正确的编辑/附加内容,但是如果我然后检查文件,则根本没有任何更改。我错过了什么吗? – Rastur 2014-09-03 20:05:06

+0

对不起,我的版本没有'sudo',没有'-i'(就地开关)。你需要添加这些。我会将其添加到答案中。 – PSkocik 2014-09-03 20:07:55

+0

我用sudo运行它,忘了提及。 – Rastur 2014-09-03 20:09:10

0

你可以这样做:

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码单引号是一些复杂的,你可以只添加它以外的变量,然后在你的代码中使用它。

+0

我和sed解决方案一样。正确编辑的文件在缓冲区中输出,但文件本身保持不变。 – Rastur 2014-09-03 20:07:44

+0

@Rastur使用'awk'改变文件:awk'code'file> tmp && mv tmp file'。对于'sed'它更简单,就像这样添加'-i':'sed -i'code'' – Jotne 2014-09-03 20:42:19

1

您可以使用此:

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 
+0

sed:-e表达式#1,字符100:未终止的's'命令 – Rastur 2014-09-03 19:44:23

+0

@Rastur哦,我错过了你有替换报价。更新了答案.. – hek2mgl 2014-09-03 20:23:06

1

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

#!/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