sed substitui o caminho unix por uma variável que contém outro caminho unix

sed substitui o caminho unix por uma variável que contém outro caminho unix

Preciso substituir o caminho Unix via sed por uma variável que contém outro caminho Unix em um script bash

Exemplo:

another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt

Responder1

Você precisa escapar de caracteres especiais:

another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'

O que gera este resultado:

/outro/unix/caminho

Responder2

Escapar de caracteres especiais /é uma opção.

Você também pode alterar o sedseparador padrão (que é /) usando ?, por exemplo:

another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'

O char usado logo após a sflag define qual separador será usado:s?

Editar:

#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt

Responder3

Se você usar /separadores, terá que escapar de todos /em seu caminho, por exemplosed 's/\/some\/path/'$replacement'/g'

Felizmente o sed - assim como o Perl - permite que muitos caracteres sejam usados ​​como separadores, então você também pode escrever sed 's#/some/path#'$replacement'#g'(o gsinalizador é usado para permitir a substituição de múltiplas ocorrências por linha).

Além disso, o sed não permitirá a substituição no local se você executá-lo em um arquivo, o que significa que você terá que gravar em um arquivo temporário e movê-lo. Atualizar:na verdade, o sed do Gnufaztem uma opção local que funciona como a do Perl: -iou -i.extonde .extestá a extensão de backup. Perl pode ser preferível para portabilidade.

Para substituição no local, você pode usar Perl como tal:

# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>

# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>

Tenha cuidado com o segundo comando, pois se você digitá-lo duas vezes irá sobrescrever seu primeiro backup!

informação relacionada