inserindo na linha usando sed

0

o texto no arquivo é assim:

[homes]
        comment = Home Directories
        path = 
        browseable = 
        writable = yes
        valid users = %S
        valid users = MYDOMAIN\%S

[printers]
        comment = All Printers
        path = /var/spool/samba
        browseable = no
        guest ok = no
        writable = no
        printable = yes

Eu quero saída como:

[homes]
        comment = Home Directories
        path = /data
        browseable = yes
        writable = yes
        valid users = %S
        valid users = MYDOMAIN\%S

[printers]
        comment = All Printers
        path = /var/spool/samba
        browseable = no
        guest ok = no
        writable = no
        printable = yes

Estou usando este comando:

sed -i "\#path# s#.*#& /data#" file

mas faz alterações em todos os lugares no arquivo em que o caminho está localizado

alguém pode me ajudar com isso?

    
por Rishav 19.09.2017 / 12:19

1 resposta

3

Seja mais específico na sua expressão regular:

sed '/path *= *$/ s#$#/data#' file.ini

A expressão /path *= *$/ corresponderá a qualquer linha com path seguido por = (possivelmente cercada por espaços), mas com nada além de espaços depois disso e o final da linha. A substituição real colocará /data no final da linha.

Isso também funcionaria:

sed "s#path *= *$#& /data#" file.ini

Se você precisar ser mais específico com a seção do arquivo INI que deseja modificar, expanda o intervalo do comando s :

sed '/\[homes\]/,/\[printers\]/ s#path *= *$#& /dev#' file.ini

Isso só aplicará a substituição à seção [homes] .

Redirecionar para um novo arquivo ou usar -i da maneira apropriada com qualquer uma das soluções acima.

    
por 19.09.2017 / 12:24

Tags