Corresponde a um padrão e substitui a primeira instância da sequência seguinte (independentemente de espaços ou tabulações)

0

Eu fiz uma pergunta semelhante há algum tempo, mas estou acertando uma parede de tijolos para que ela funcione.

Estou programando a modificação de um arquivo de configuração assim:

[Thing1]
    [[subthingA]]
        this = 0
        that = string
        and = localhost
        the = 80
        other = 0
        thing_ading = /path/to/a/dir

[Thing2]
    [[subthingB]]
        this = 0
        thing_ading = /path/to/dir
        here = 0

Onde há N número de [Coisas], geralmente com a mesma chave e / ou valor de um par chave / valor, e os pares chave / valor sob os [[subentendidos]] são recuados por exatamente 8 espaços. Eu estou especificamente tentando criar um one-liner usando awk / sed / grep / tr / cut / perl que pode alterar o valor de thing_ading sob SubthingB para um caminho de diretório diferente.

Consigo editar todos os thing_adings e consegui segmentar determinados pares, mas os espaços estão realmente me dando um problema.

    
por user1930831 05.07.2017 / 08:21

2 respostas

1

Você pode resolver esses problemas usando o operador de intervalo sed , :

sed -e '
   /^\[Thing2]$/,/^$/!b
   /^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*| = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
  • Primeiro, você seleciona o intervalo adequado pulando intervalos impróprios.
  • Em seguida, quando estiver no intervalo adequado, você executará a substituição na variável thing_ding necessária.
por 05.07.2017 / 08:53
0

Aqui está uma sed one-liner:

sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file

Para trabalhar apenas no bloco subthingB , abordamos tudo, desde [[subthingB]] até a próxima linha, começando com [ após o recuo.

Agora, para este bloco, endereçamos a linha thing_ading e fazemos a substituição, usando _ em vez de / como delimitado pelo comando s para evitar que a substituição da barra invertida seja ilegível.

Se for garantido que o bloco subthingB tenha uma entrada thing_ading , você pode simplificar para

sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'

reutilizando o último padrão para endereçamento interno.

    
por 05.07.2017 / 08:35