使用 sed 将代码块附加到 my.cnf

Ras*_*tur 3 linux sed

我正在尝试设置一个 bash 脚本以将一些代码行附加到 /etc/mysql/my.cnf

[mysqld] <-- new code needs to append here
old code
old code
old code
Run Code Online (Sandbox Code Playgroud)

应该导致

[mysqld]
# set default collation
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
old code
old code
old code
Run Code Online (Sandbox Code Playgroud)

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

#!/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
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 5

sed '/\[mysqld\]/a # set default collation\
collation-server = utf8_unicode_ci\
init-connect='\''SET NAMES utf8'\''\
character-set-server = utf8\' /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)

您可以使用 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
Run Code Online (Sandbox Code Playgroud)