Como alterar o conteúdo do arquivo no linux?

3

Eu tenho 3 arquivos de configuração na minha caixa Linux que contém informações de configuração para um aplicativo personalizado. Eu quero mudar alguns valores nos arquivos de configuração. O conteúdo dos arquivos e descrições é fornecido abaixo:

conteúdo do arquivo config1:

set VAR1=/app/client/10x_64/instance

conteúdo do arquivo config2:

set VAR2=/app/client/11x/instance

conteúdo do arquivo config3:

set VAR3=/app/client/11x_64/instance

Eu quero alterar todos os valores 10x_64, 11x, 11x_64 para 12x_64 em todos os arquivos. Atualmente estou usando três comandos para alterar o conteúdo; os comandos são dados abaixo:

sed -i 's/10x_64/12x_64/g' config1
sed -i 's/11x/12x_64/g' config2
sed -i 's/11x_64/12x_64/g' config3

Eu quero um único comando generalizado para alterar o conteúdo de todos os três arquivos.

    
por Thejesh PR 01.03.2016 / 08:12

4 respostas

6

Se você quiser uma única expressão, faça:

sed -i 's#/client/[^/]*#/client/12x_64#g' config*

Eu usei /client/[^/]* como marcador para encontrar o que queremos substituir (ou seja, depois de /client/ , mas antes do próximo / ), mas poderíamos ter feito client/[^/]*/instance se isso evitar a correspondência outros itens no arquivo.

    
por 01.03.2016 / 09:11
2

Você pode simplesmente combiná-los assim:

sed -i 's/10x_64/12x_64/g;s/11x/12x_64/g;s/11x_64/12x_64/g' config*

    
por 01.03.2016 / 08:23
2

Que tal preparar um "arquivo de configuração de modelo", no qual você substitui as partes de configuração necessárias para uma versão específica? Digamos que você tenha o seguinte modelo

#/bin/bash
echo "set ##V1##=/app/client/##ARCH1##/instance" > cfg-file1
echo "set ##V2##=/app/client/##ARCH2##/instance" > cfg-file1
echo "set ##V3##=/app/client/##ARCH3##/instance" > cfg-file1

Então você poderia substituir comandos por versão, dependendo de um parâmetro de linha de comando:

#!/bin/bash
[ $# -lt 1 ] && (echo "usage: replace <version>"; exit 1;)
if [ "$1" == "1" ]; then
        cat  template.txt | sed -e "s/##V1##/VAR1/g;s/##ARCH1##/arch_xy_/g;s/##V2##/VAR2/g;s/##ARCH2##/arch2_xy_/g;"
        # etc...
fi

Isso pode ser facilmente estendido.

    
por 01.03.2016 / 09:46
2

Você pode combinar todos os três comandos em uma única expressão. O que você deseja fazer é substituir todos os casos de 1 seguidos por 0 ou 1 , depois x e, em seguida, _64 opcional. Isso pode ser expresso pela seguinte expressão regular estendida:

1[01]x(_64)*

O [ ] denota uma classe de caracteres , portanto, [01] corresponde a um ou a zero. A construção (foo)* corresponderá a 0 ou mais instâncias de foo . Portanto, (_64)* corresponderá à string _64 (e suas repetições como _64_64_64 ) e à string vazia. Isso permite corresponder os 11_x64 e 11x e quando não é.

Então, se combinarmos isso em uma expressão sed , obteremos:

sed -iE 's/1[01]x(_64)*/12_64/' config*
    
por 01.03.2016 / 10:12

Tags