Se não houver chance de que qualquer um dos caracteres <> |
possa ocorrer dentro dos dados que você deseja reter em seu arquivo, então, quase definitivamente, a solução mais eficiente é simplesmente tr
analisá-los completamente:
tr '<>|' ' ' <infile | ###translate all delimiter chars to spaces
tr -s ' ' >outfile ###pipe results to second tr and squeeze spaces
sed
pode funcionar para você também, mas se isso acontecer, será quase definitivamente mais lento. Você deve ser cuidadoso ao trabalhar com arquivos de entrada não baseados em delimitadores \n
eww e usar ferramentas projetadas para manipular dados delimitados por \n
ewline (como sed
e grep
) porque alguns implementações podem entrar em colapso sob tensão de buffer.
Seu problema não é (ainda) que, em vez disso: você enviou uma sintaxe inválida como um comando sed
. @Archemar já comentou sobre o que é, mas aqui está o porquê:
Um sed
s///
ubstitution é um comando composto de três campos:
- a primitiva de comando
s
seguida por um delimitador (normalmente/
) - o campo de padrão de expressão regular seguido pelo mesmo delimitador
- o campo de substituição seguido pelo delimitador e pelas bandeiras opcionais
Um ou ambos os dois últimos podem ser de comprimento zero por razões diferentes - e, portanto, s///
é uma sintaxe aceitável (dependendo do contexto) . Isso significa que o sed
parser deve depender muito do delimitador. Em seu comando você especifica muitos campos - o que é um erro de sintaxe, e é por isso que sua função não pode ser analisada .
Se a sed
de sua implementação puder manipular a entrada de linha única e for compatível com POSIX, isso deverá funcionar:
sed 'y/<>|/ /;s/ */ /g' <infile >outfile
... em que a% prim_de y
acima é a função de co-publicação sed
da tr
.