Contanto que stdout
e stderr
tenham buffer de linha e as linhas de um dos dois sejam sempre spottable, misturá-las não é um problema: considere a saída de um programa em que stdout
e stderr
são preenchidos com linha e em que stderr
é facilmente reproduzível:
$ cat file
xxxxxxxxxx
tar: ----------
yyyyyyyyyy
tar: ----------
zzzzzzzzzz
tar: ----------
A extração de um dos dois usando grep
não é um problema:
$ < file grep -v ^tar
xxxxxxxxxx # stdout line 1
yyyyyyyyyy # stdout line 2
zzzzzzzzzz # stdout line 3
$ < file grep ^tar
tar: ---------- # stderr line 1
tar: ---------- # stderr line 2
tar: ---------- # stderr line 3
No entanto, considere o caso em que, em algum momento, o comportamento do buffer stdout
muda para, digamos, sem buffer:
x
tar: ----------
xxxxxxxxxyyy
tar: ----------
yyyyyyyzzzzz
tar: ----------
zzzzz
A extração de stdout
usando grep
é um problema:
$ < file grep -v ^tar
x # wrong stdout line 1
xxxxxxxxxyyy # wrong stdout line 2
yyyyyyyzzzzz # wrong stdout line 3
zzzzz # wrong stdout line 4
Tente isso:
< file perl -0777pe 's/\n?tar: [^\n]*\n//g' > newfile
Qual, excluindo os casos de [borda], deve extrair o stdout
original do arquivo:
$ < file perl -0777pe 's/\n?tar: [^\n]*\n//g'
xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz