Substituir tudo, exceto a primeira linha

0

Eu tenho o seguinte script de shell:

#!/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

O que eu quero é substituir a primeira linha no arquivo mencionado em $xdebug_config variable EXCETO da primeira linha. Por exemplo, se o arquivo for:

line 1
line 2
somethig else
lalala

Eu quero ser convertido assim:

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

Como posso conseguir isso?

Editar 1

Conforme solicitado nos comentários, o $xdebug_config pode conter esses valores possíveis:

 /etc/php/7.2/mods-available/xdebug.ini
 /etc/php/5.6/mods-available/xdebug.ini
 /etc/php/7.0/mods-available/xdebug.ini

Geralmente, ele estará no seguinte formato:

 /etc/php/^number^.^number^/mods-available/xdebug.ini

Editar 2

Eu aperfeiçoei o script de shell para ficar mais claro.

    
por Dimitrios Desyllas 12.09.2018 / 21:18

4 respostas

2

Que tal um documento AQUI?

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

Espero que isso ajude

    
por 12.09.2018 / 21:33
1

Para substituir o conteúdo de um arquivo por dados conhecidos arbitrários, mas preservar a primeira linha, você pode fazer algo como:

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"

A vantagem de criar um novo arquivo e colocá-lo em prática depois que ele é totalmente composto é que você pode manter a última versão caso precise revertê-lo.

Se você não tem interesse em fazer isso, pode simplesmente explodir o arquivo antigo, mas não pode ler e gravar nele na mesma operação, então algo assim funcionará:

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
    
por 12.09.2018 / 21:42
1

Eu escreveria

{ sed 1q "$xdebug_config"; echo "$config"; } | sponge "$xdebug_config"

sponge está no pacote moreutils . Se você não quiser instalar isso:

tmp=$(mktemp)
{ sed 1q "$xdebug_config"; echo "$config"; } > "$tmp" && mv "$tmp" "$xdebug_config"
    
por 12.09.2018 / 21:49
0

você pode fazer isso assim:

tempd=$(mktemp -d);printf '%s\n' "$config" > "$tempd/config"
sed -i -e "r $tempd/config" -e q "$xdebug_config"
rm -rf "$tempd"
    
por 13.09.2018 / 07:46