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のおかげで、ついにこの問題を解決しました。

まず、およびを2つの異なる変数に分割して読みやすさ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

$PATTERNsedコマンドで二重引用符をエスケープしました。
それだけです!

おすすめ記事