次のシェルスクリプトがあります。
#!/bin/sh
echo "Configuring Xdebug"
ip=10.0.2.2
xdebug_config="/etc/php/7.2/mods-available/xdebug.ini"
echo "IP for the xdebug to connect back: ${ip}"
echo "Xdebug Configuration path: ${xdebug_config}"
echo "Port for the Xdebug to connect back: ${XDEBUG_PORT}"
echo "Optimize for ${IDE} ide"
if [ $IDE=='atom' ]; then
echo "Configuring xdebug for ATOM ide"
config="xdebug.remote_enable = 1
xdebug.remote_host=${ip}
xdebug.remote_port = ${XDEBUG_PORT}
xdebug.max_nesting_level = 1000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
xdebug.remote_log=xdebug.log"
# replace the file in $xdebug_config var except first line
fi
私が望むのは、$xdebug_config
変数に記載されているファイルの最初の行を置き換えることです。とは別に最初の行。たとえば、ファイルが次のような場合:
line 1
line 2
somethig else
lalala
次のように変換したいと思います。
line 1
xdebug.remote_enable = 1
xdebug.remote_host=${ip}
xdebug.remote_port = ${XDEBUG_PORT}
xdebug.max_nesting_level = 1000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
xdebug.remote_log=xdebug.log
どうすればいいですか?
編集1
コメントのリクエストに応じて、$xdebug_config
次の可能な値を含めることができます。
/etc/php/7.2/mods-available/xdebug.ini
/etc/php/5.6/mods-available/xdebug.ini
/etc/php/7.0/mods-available/xdebug.ini
通常、次の形式を使用します。
/etc/php/^number^.^number^/mods-available/xdebug.ini
編集2
シェルスクリプトをより明確に改善しました。
答え1
ここの文書はどうですか?
line1=$(head -1 "$1")
cat <<EORL >"$1"
${line1}
this is line2
how about this for line3?
let's do another line!
moving on to the next line
Wait! There's more???
EORL
exit 0
答え2
ファイルの内容を既知のデータに置き換えますが、最初の行を保持するには、次のようにします。
oldfile="/path/to/original/file"
newfile="$(mktemp)"
head -n1 "$oldfile" > "$newfile"
cat << EOF >> "$newfile"
Hey, all of these lines?
The lines after "cat"?
All of these lines up to and excluding the next line will be written.
EOF
mv "$oldfile" "${oldfile}.old"
mv "$newfile" "$oldfile"
新しいファイルを作成し、完全に設定した後にその場所に移動すると、ロールバックする必要がある場合に備えて最後のバージョンを維持できるという利点があります。
そうすることに興味がない場合は、古いファイルを吹き飛ばすことができますが、同じ操作でそのファイルを読み書きできないため、次のように動作します。
header="$(head -n1 /path/to/file)"
echo "$header" > /path/to/file
cat << EOF >> /path/to/file
Hey, all of these lines?
The lines after "cat"?
All of these lines up to and excluding the next line will be written.
EOF
答え3
私は書くことができます
{ sed 1q "$xdebug_config"; echo "$config"; } | sponge "$xdebug_config"
sponge
moreutils
パッケージの内側にあります。インストールしたくない場合:
tmp=$(mktemp)
{ sed 1q "$xdebug_config"; echo "$config"; } > "$tmp" && mv "$tmp" "$xdebug_config"
答え4
次のことができます。
tempd=$(mktemp -d);printf '%s\n' "$config" > "$tempd/config"
sed -i -e "r $tempd/config" -e q "$xdebug_config"
rm -rf "$tempd"