Use sed para editar os caracteres 65-79 se a string estiver presente na posição anterior

0

Estou tentando descobrir como usar o sed (percebo que poderia usar outras ferramentas, mas gostaria de saber como fazê-lo no sed, se realmente fizer mais sentido em outra ferramenta, por favor avise) para editar um arquivo contendo linhas como esta:

1234561234567809912345612345678    00000999988STRING ONE        EX30 0600000001 K XXYY
1122331122334409922334466554433    00000123499STRING TWO        EX99 0600000002 K XXYY

bem como várias outras linhas com diferentes formatos.

as strings STRING ONE e STRING TWO estão nas posições 47-64 (incluindo os seguintes espaços).

Eu quero mudar o texto nas posições 65-80 para outro valor dependente do conteúdo das posições 47-64.

Portanto, para a linha STRING ONE, os caracteres 65-80 serão alterados para "AAAABBBBCCCC" (4 espaços à direita).

Na linha STRING TWO, os caracteres 65 a 80 seriam alterados para "XXXYYYZZZ" (quatro espaços à direita).

Eu cheguei até aqui:

sed 's/^\(.\{64\}\)EX/34567890 /'

que substituirá "EX" no caractere 65 para "234567890", mas isso

  • não conta para escolher as linhas corretas (com STRING ONE ou STRING DOIS)
  • apenas substitui "EX"

& Há outras coisas que não estou seguindo aqui.

  • Por que o ponto entre o colchete aberto & a barra invertida?
  • por que preceder o 1 com uma barra invertida (o que parece ser necessário, mas faz com que o 1 não esteja na string substituta)?

Eu não tenho que entender essas coisas, mas estou curioso.

Espero que eu possa fazer isso usando grep & manipulando a saída para arquivos temporários ou variáveis de ambiente, mas seria bom saber se posso fazê-lo com mais elegância.

    
por Chris 02.12.2016 / 17:31

1 resposta

0

. em um padrão significa "qualquer caractere". .\{64\} significa "64 caracteres", nenhum deles.

é uma referência anterior ao primeiro grupo correspondente, ou seja, o que foi correspondido pelo primeiro par de \(...\) parênteses. Para inserir um literal 1 , não prefixe a barra invertida.

Você pode usar "endereços" em sed para restringir um comando apenas a algumas linhas, por exemplo,

sed '/^.\{46\}STRING ONE \{8\}/s/^\(.\{64\}\).\{16\}/AAAABBBBCCCC    /'

que lê Se a linha começar com 46 caracteres seguidos por STRING ONE e 8 espaços, lembre-se dos primeiros 64 caracteres em e substitua-os e os seguintes 16 caracteres pelos caracteres lembrados, seguidos por AAAABBBBCCCC e quatro espaços.

Para adicionar mais comandos com endereços, separe-os com ponto e vírgula ou use vários -e switches:

sed -e '/address1/s/pattern1/replacement1/;/address2/s/pattern2/replacement2/'
sed -e '/address1/s/pattern1/replacement1/' -e '/address2/s/pattern2/replacement2/'
    
por 02.12.2016 / 17:41

Tags