Como sed encontrar padrão em um campo, mas acrescentar outro (mesma linha)

2

Eu tenho um arquivo de texto que possui valores separados por vírgula. O campo1 tem um campo que precisa ser correspondido, mas o campo dois precisa de substituição com base na correspondência.

Exemplo:

A, C
B, C

Resultado:
A, D
B, C

Suponho que o comando seria mais ou menos como:

sed 's/A/D/'

Obrigado

    
por sgp667 19.02.2014 / 21:08

2 respostas

0

Que tal isso

$ echo A,fgfdgd|sed -r 's/A,[^,]*/A,D/'
A,D

Se a primeira coluna for A e, em seguida, houver uma vírgula e houver algo na segunda coluna, ela será substituída por A, D. Isso só acontecerá quando corresponder a A na primeira coluna (seguido por uma vírgula e o que quer que seja na segunda coluna).

Um exemplo com um arquivo

Isso transforma seu exemplo em seu resultado. Então, onde sua primeira coluna é A, sua segunda coluna se torna D.

$ cat a.b
A,C
B,C


$ sed -r 's/A,[^,]*/A,D/' a.b
A,D
B,C


$
    
por 19.02.2014 / 21:36
1

Use uma expressão de endereço para selecionar as linhas que você deseja editar e, em seguida, use uma substituição regular para realmente fazer a substituição. Uma coisa divertida sobre o sed é que, antes do comando "s", você pode especificar um número de linha ou uma expressão regular para escolher as linhas que lhe interessam (o endereço também pode ser um início e um fim separados por vírgulas que especificam todas as linhas contido dentro do "intervalo de endereços", mas deixando a segunda parte fora seleciona linhas simples).

Em sua expressão de endereço, procure "não uma vírgula, seguida do que você deseja".

Na substituição, lembre-se das coisas antes do seu padrão, depois coloque as partes "antes" antes da sua string substituta. Você se lembra da parte "antes" porque quer que o material anterior inclua apenas uma vírgula, nem mais nem menos. Aqui está mostrando que combina com o primeiro campo e impacta apenas o segundo; Estou substituindo "la" por "moo" na segunda coluna de linhas que correspondem a "atter" na primeira coluna.

$ echo -e "pattern,blah,aaa\npattern,bleh,stuff" | sed '/[^,]*atter/s/\(^[^,]*,[^,]*\)la/moo/g'
pattern,bmooh,aaa
pattern,bleh,stuff

Isso sozinho não funcionará corretamente com vírgulas com escape nos campos, portanto, esperamos que seu arquivo CSV seja simples. :)

    
por 19.02.2014 / 22:41