Comando Unix bash Sed Combinação em um arquivo

4

Eu tenho um arquivo contendo strings delimitadas por qualquer um dos seguintes caracteres indesejados:

  1. <
  2. >
  3. |
  4. < espaço >

Parece assim:

...  > Test Item|Test Item ...

As elipses ... acima representam continuação. O arquivo é composto por apenas uma única linha.

Eu gostaria de modificar o arquivo para que as strings sejam delimitadas com apenas um único caracter < space > . Por exemplo:

... Test Item Test Item ...

Com sed tentei:

sed -e 's/< >*| */|//g' filename

Mas isso retornou a seguinte mensagem de erro:

sed: 0602-404 Function s/<  *| */|//g cannot be parsed.

O que fazer?

    
por Aman 02.04.2015 / 09:13

2 respostas

1

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:

  1. a primitiva de comando s seguida por um delimitador (normalmente / )
  2. o campo de padrão de expressão regular seguido pelo mesmo delimitador
  3. 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 .

    
por 02.04.2015 / 11:05
2

Tente desta maneira:

sed -e 's:<>\s\|.*:Replaced:g' filename

É assim que o resultado se parece:

$ echo "<> |" | sed -e 's:<>\s\|.*:Replaced:g'
Replaced

Se você quiser apenas removê-lo, exclua a palavra Replaced do comando.

Se houver um espaço entre os símbolos < e > , você deverá substituir <> por <\s> .

Após a atualização da pergunta :

$ cat filename
  > Test Item|Test Item
  < Test Item|Test Item

$ cat filename | sed -E 's:[<>]\s(.*)\|(.*)$: :g'
  Test Item Test Item
  Test Item Test Item
    
por 02.04.2015 / 09:22

Tags