Localiza e substitui string entre dois delimitadores

2

Como substituo uma string entre dois delimitadores?

Algumas das respostas que encontrei são próximas, mas acho que minha necessidade é um pouco mais complexa.

Ou seja. smb.conf contém uma linha em branco entre compartilhamentos. Quero segmentar o compartilhamento que desejo atualizar. O primeiro delimitador é "[nome do compartilhamento]" e o delimitador final pode ser uma linha em branco.

Eu quero encontrar e substituir "writable = yes" por "writable = no", que pode ser formatado inexatamente por causa do espaço em branco, mas deve ocorrer entre meus dois delimitadores.

    
por Brian Cuttler 18.06.2018 / 22:28

4 respostas

1

Quase lá, graças a essa lista e ao link .

Eu posso na linha de comando substituir o "gravável" por "# gravável" e posso fazê-lo sem considerar a configuração Y / N, eu insiro outra linha mais tarde.

sed '/\[${share_name}\]/,/^$/{/\[${share_name}\]/n;/^$/!{s/writeable/\#writeable/g}}' \
< ${input_file} \
> /tmp/parse-smb.tmp

Enquanto isso funciona na linha de comando com o "!" escapou "!" ele não funciona em um arquivo de script, / bin / sh. Eu tenho que remover a fuga, mas o gatilho não acerta.

Sutilezas da concha.

    
por 22.06.2018 / 15:44
1

Ah, o "!" estava bem, foi a falha da variável "share_name" para traduzir. Use aspas duplas em vez de simples neste comando.

sed "/\${share_name}\]/,/^$/{/[${share_name}\]/n;/^$/!s/writeable/\#writeable/g}}" \
< ${input_file} \
> /tmp/parse-smb.tmp

Deveria ter percebido que a linha subsequente também usou aspas duplas.

sed -i "s/\[${share_name}\]/\[${share_name}\]\n\thosts allow = 10.50.157.0\/24 \n\twriteable = no/" \
/tmp/parse-smb.tmp
    
por 22.06.2018 / 15:47
0

Eu consideraria perl: não testado

perl -00 -pe '/^\[your_share_name\]/ and s/writable\s*=\s*\Kyes/no/si' smb.conf
    
por 18.06.2018 / 22:48
0

Eu acho que isso é um trabalho para o perl (ou python se você é tão inclinado).

iMac$ cat ./replace.pl
#!/usr/bin/perl

while (<>) {
    if (/^\n/) { $replace = 0; }
    if (/\[share3\]/) { $replace = 1; }
    print unless /writable/;
    if (/writable/) {
    if ($replace == 1) {
        print "  writable = no\n";
    }
    else {
        print;
    }
    }
}
iMac$ cat smb.conf 
[share1]
  writable = yes
  user = anonymous
  host = remote

[share2]
  writable = yes
  user = anonymous
  host = remote

[share3]
  writable = yes
  user = anonymous
  host = remote

[share4]
  writable = yes
  user = anonymous
  host = remote

[share5]
  writable = yes
  user = anonymous
  host = remote
iMac$ cat smb.conf | ./replace.pl
[share1]
  writable = yes
  user = anonymous
  host = remote

[share2]
  writable = yes
  user = anonymous
  host = remote

[share3]
  writable = no
  user = anonymous
  host = remote

[share4]
  writable = yes
  user = anonymous
  host = remote

[share5]
  writable = yes
  user = anonymous
  host = remote
    
por 18.06.2018 / 22:56

Tags