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