Como posso adicionar texto ao final de uma linha que contém várias strings?

0

Eu tenho um arquivo como este:

1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211
3;1471383211;frank;WO12345;1471385211
4;1471385311;frank;WO12345;
5;1471385311;joe;WO12346;1471388211

Gostaria de usar um script bash para encontrar a linha que contém um nome especificado (como frank ), bem como um número WO especificado (como WO12345 ) e também termina com um ; . adicione uma string ao final da linha. Eu quero editar o arquivo diretamente, não a saída para stdout. Eu sei como usar read para obter o nome e o número WO. Eu estou supondo sed com -i é a ferramenta certa. Como posso fazer isso?

    
por aswine 17.08.2016 / 20:42

2 respostas

2

Se o nome e o WO forem sempre consecutivos, é bastante simples:

sed  '/frank;WO12345;/s/;$/;sometext/' -i file

Se eles puderem aparecer de qualquer maneira, ou não necessariamente próximos um do outro, use blocos de comandos para combinar os dois testes:

sed  '/;frank;/{/;WO12345;/s/;$/;sometext/}' -i file
    
por 17.08.2016 / 20:56
1

awk é mais adequado para dados separados por campo.

Usando awk :

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt

substitua ;Foobar pelo que você deseja inserir no final.

Aqui estamos verificando se ; separaram os campos 3 e 4 e se correspondem as strings desejadas, se a string ;Foobar for adicionada no final.

O mais recente% GNUawk (> = 4.10) tem a opção de edição no local:

awk -i inplace -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt

Se você não tem que usar sponge do GNU moreutils ou um arquivo temporaruy:

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt | sponge file.txt

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' \
       file.txt >file_temp.txt && mv file_temp.txt file.txt

Se você insistir em sed :

sed -Ei '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
  • ([^;]*;){2} corresponde aos dois primeiros campos e, em seguida, verificamos se o terceiro e o quarto campos são desejados e, em seguida, a substituição é feita

Exemplo:

$ cat file.txt
1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211
3;1471383211;frank;WO12345;1471385211
4;1471385311;frank;WO12345;
5;1471385311;joe;WO12346;1471388211

$ awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt
2;1471378551;frank;WO12345;1471380211;Foobar
3;1471383211;frank;WO12345;1471385211;Foobar
4;1471385311;frank;WO12345;;Foobar

$ sed -E '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211;Foobar
3;1471383211;frank;WO12345;1471385211;Foobar
4;1471385311;frank;WO12345;;Foobar
5;1471385311;joe;WO12346;1471388211
    
por 17.08.2016 / 20:53