Não é muito difícil com sed
realmente. Você sempre pode delimitar uma seção com um \n
ewline ou para trocar um delimitador por \n
ewline temporariamente. E você pode fazer isso sem um loop:
sed 's/$/START/;s/END/&
/g; y/D\n/\nD/
s/\([^D]*START\)*[D\"]*//g
y/\n/D/;s/.....$//
' <<\IN
\"XXX \ START sapiodj \" aj \d 2387 END hddo\" START bbcc \" END ss
IN
Às vezes você só precisa pensar em um problema de maneira um pouco diferente. Em vez de remover todo o \"
entre START
e END
se, em vez disso, mudarmos o problema para a forma como podemos economizar \"
apenas se ocorrerem entre o início da linha e START
, START
e END
strings, e o último END
e o final da linha fica um pouco mais fácil (se, reconhecidamente, não intuitivamente) . Isso ocorre devido à maneira como sed
processa *
zero ou mais correspondências em g
lobal s///
contexto de ubstitution .
Enquanto oSTART
de head-to-first-% será eliminado como resultado natural do restante, o últimoEND
-to-tail não - e, portanto, precisamos acrescentar outro START
para o final da linha. Depois de obtermos nosso START
extra, acrescentamos um caractere \n
ewline a cada ocorrência de END
. E, em seguida, com o comando y///
transliterate, negociamos simultaneamente todos os D
chars para \n
ewlines e vice-versa. O comando y///
transliteration, aliás, não é apenas muito útil aqui, mas também é mais eficiente do que um s///
ubstitution seria.
Neste momento, um l
ook no nosso espaço padrão seria impresso:
\"XXX \ START sapiodj \\" aj \d 2387 EN\nD hddo\" START bbcc \\" EN\nD ssSTART$
Como você pode ver, agora todos os caracteres de \"
que precisam ser salvos estão exatamente entre o início da linha ou as sequências D
e START
e não há D
s entre elas. Portanto, a g
lobal s///
ubstitution que remove os caracteres indesejados - para incluir nosso D
s adicional - também substitui os que precisam ser salvos com eles mesmos. Por último, precisamos apenas trocar \n
e D
s novamente e remover o último START
.
Desta forma, você pode delimitar de forma confiável os campos com sed
independentemente da entrada e você não precisa depender de nenhum caractere que não ocorra, mas o que é garantido nunca ocorrer em uma linha - e esse é o caractere \n
ewline, é claro.
Quando terminar, imprime:
\"XXX \ START sapiodj aj d 2387 END hddo\" START bbcc END ss