Como remover string entre duas strings?

1

ENTRADA:

$ cat a.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\ h\:mm\ AM\/PM\;\@";' x:str>BAR

OUTPUT:

$ sed 's/SOMEMAGIC//g' a.txt
FOOBAR

Minha pergunta: Como posso remover essa parte horrível de "< td align ......"? Isso me deixa louco !!

    
por evachristine 21.05.2014 / 21:44

3 respostas

0

Você também pode usar isso,

sed 's/^\([^<]*\)<.*>\(.*\)$//g' file

Explicação:

^\([^<]*\)< - Retorna qualquer caractere que não seja < zero ou mais da posição inicial até < e, finalmente, armazena os caracteres buscados em um grupo.

.*> - Corresponde a qualquer caractere zero ou mais vezes até encontrar > .

\(.*\)$ - Quando o sed encontra o caractere > , ele começa a armazenar todos os caracteres que estão ao lado de > até o último em outro grupo ( armazena caracteres entre > e $ ).

Por fim, sed imprime apenas os grupos armazenados ( , ) por referência de volta.

Exemplo:

$ cat file.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\ h\:mm\ AM\/PM\;\@";' x:str>BAR
$ sed 's/^\([^<]*\)<.*>\(.*\)$//g' file.txt
FOOBAR
    
por 22.05.2014 / 03:55
3

Bem, isso certamente é fácil:

sed -i 's/<.*>//' file

Não há muito a explicar aqui:

  • o < é o começo da parte que queremos corresponder
  • .* significa qualquer caractere ( . ) e qualquer valor ( * ). Este é um canhão para matar um mosquito, mas deve funcionar para os exemplos não-esotéricos
  • > final da partida.

Aqui está ao vivo:

➜  ~  cat test 
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\ h\:mm\ AM\/PM\;\@";' x:str>BAR
➜  ~  sed 's/<.*>//' test
FOOBAR
    
por 21.05.2014 / 21:57
0

Uma solução perl :

$ perl -F'<.*>' -anle 'print @F' file
FOOBAR

Aqui usamos regex <.*> como delimitador para dividir a linha em vez de removê-la.

    
por 22.05.2014 / 03:49