2014-09-03 84 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