sed para alterar o primeiro jogo de um jogo diferente

2

Eu quero alterar o PATH e LOC_NAME do grupo específico em um arquivo de texto.

Por exemplo:

[a]
PATH=/tmp
SUR=Y
LOC_NAME=USA
[b]
PATH=/tmp
SUR=N
LOC_NAME=UK

Então, se para pesquisar [b] eu quero mudar o único primeiro jogo vindo depois dele (depois de não após o próximo [*] ):

sed -i '/PATH/c\PATH=\/u01'
sed -i '/LOC_NAME/c\LOC_NAME=RUS'
    
por Nir 04.12.2017 / 09:24

2 respostas

1

Você estava muito perto!

Você pode adicionar um intervalo de endereços para a parte que deve ser alterada. Se você quiser deixar tudo intocado fora do bloco da linha [b] para a próxima linha começando com [ , escolha um intervalo de endereços com uma vírgula entre as duas expressões (agora você tem apenas o bloco a ser alterado), inverta-o com ! (agora você tem todo o resto) e use o comando b para ramificar até o final do script. Portanto, todos os comandos a seguir afetarão apenas as linhas dentro do intervalo:

sed -i '/^\[b\]$/,/^\[/!b
  /PATH/c\PATH=\/u01
  /LOC_NAME/c\LOC_NAME=RUS'

É claro que, em vez de inverter e ramificar, você pode usar um bloco {commands;...;} para a correspondência não invertida, mas acho que isso é menos legível.

Se você quiser usar uma palavra dentro de uma variável como identificador, você pode fazer assim:

ID=foo
sed -i '/^\['$ID'\]$/,/^\[/!b
  /PATH/c\PATH=\/u01
  /LOC_NAME/c\LOC_NAME=RUS'
    
por 04.12.2017 / 14:30
1

Provavelmente mais fácil com awk ou Perl:

$ cat input
[a]
PATH=/tmp
[b]
PATH=/tmp
OTHERPATH=/somedir
[c]
PATH=/tmp

$ gr="[b]"
$ repl=/u01
$ awk -vgr="$gr" -vrepl="$repl"  '/^\[.*\]$/ { group=$0 } group == gr && /^PATH=/ { $0 = "PATH=" repl } 1' input
[a]
PATH=/tmp
[b]
PATH=/u01
OTHERPATH=/somedir
[c]
PATH=/tmp

$ gr=b
$ repl=/u01
$ gr=$gr repl=$repl perl -pe '$group = $1 if /^\[(.*)\]$/; s,^PATH=.*,PATH=$ENV{repl}, if $group eq $ENV{gr}' < input
[same output]

A ideia é encontrar linhas que possuam [something] , anote o nome e, em seguida, torne a substituição condicional a isso. (Note que a versão awk pega o nome do grupo com os colchetes, a versão Perl sem eles. O último é mais bonito, mas não tão trivial no awk quanto no Perl. A versão Perl leva as variáveis pelo ambiente, então você precisará para export gr e repl ou atribua-os na mesma linha de comando.

Eu modifiquei isso para substituir somente se a chave for exatamente PATH , mas eles ainda alterarão todos os PATH s sob o mesmo título [b] (não apenas o primeiro), mas não tenho certeza se você pode ter vários.

    
por 04.12.2017 / 09:52