执行 sed 抛出错误“查找匹配时出现意外的 EOF”

执行 sed 抛出错误“查找匹配时出现意外的 EOF”

问题就在这里。
我正在尝试以“root”用户身份以“myusername”用户身份执行命令。

这就是为什么我使用su - $USERNAME -c <command>
The<command>本身就像sudo sed -i 's|SEARCH_REGEX|REPLACEMENT|' /etc/cloud/cloud.cfg

但每次执行脚本时,我都会收到一个错误,这似乎是由于该REPLACEMENT部分造成的。
我猜这是关于回车或空格的事情。

这是代码:

#!/bin/bash
$USERNAME="myusername"
$USERPWD="p@ssw0rd123"
PATTERN='s|preserve_hostname:\sfalse|preserve_hostname: true\nmanage_etc_hosts: false|'
su - $USERNAME -c 'sudo -S bash -c "sed -i '$PATTERN' /etc/cloud/cloud.cfg"' <<< $USERPWD

这是我得到的错误:

 true\nmanage_etc_hosts:: -c: line 0: unexpected EOF while looking for matching `"'
 true\nmanage_etc_hosts:: -c: line 1: syntax error: unexpected end of file

对我有帮助的资源:
https://linuxize.com/post/how-to-use-sed-to-find-and-replace-string-in-files/
https://linuxhint.com/50_sed_command_examples/

我究竟做错了什么 ?

答案1

感谢@Quasimodo,我终于解决了这个问题。

首先,我PATTERN通过将REGEXPREPLACEMENT分成两个不同的变量来增强可读性。
然后基本上我所做的就是将单引号更改为双引号,反之亦然。

REGEXP="preserve_hostname:\sfalse"
REPLACEMENT="preserve_hostname: true\nmanage_etc_hosts: false"
PATTERN="s/$REGEXP/$REPLACEMENT/"
su - $USERNAME -c "sudo -S bash -c 'sed -n -i \"$PATTERN\" /etc/cloud/cloud.cfg'" <<< $USERPWD

$PATTERN请注意,我在 sed 命令中转义了双引号。
就是这样!

相关内容