$ 1 não está funcionando com sed

0

Eu tenho um monte de arquivos que contêm tags XML como:

<h> PIDAT <h> O

Eu preciso excluir tudo o que vem depois do primeiro <h> nessa linha, para que eu possa obter isso:

<h>

Para isso, estou usando

sed -i -e 's/(^<.*?>).+/$1/' *.conll

Mas parece que o sed não está reconhecendo o $1 . (Pelo que entendi, $1 deve apagar tudo o que não está contido no grupo). Existe uma maneira que eu possa conseguir isso? Eu realmente apreciaria se você pudesse me apontar na direção certa.

PS: Eu testei essas expressões em um aplicativo regex e elas funcionaram, mas não está funcionando na linha de comando.

    
por Carolina Cárdenas 05.07.2018 / 07:16

1 resposta

3

sed backreferences tem o formato , , etc. $1 é mais semelhante a Perl. Além disso, se estiver usando expressões regulares básicas (BRE), você precisará excluir os parênteses (...) formando um grupo, bem como ? e + . Ou você pode usar expressões regulares estendidas com a opção -E .

Observe que as regexes sed são gananciosas, portanto, <.*> corresponderá a <h> PIDAT <h> nessa linha, em vez de parar no primeiro > . E .*? não faz sentido ( .* já não pode corresponder a nada, portanto, torná-lo opcional via ? é desnecessário).

Isso pode funcionar:

sed -i -Ee 's/^(<[^>]*>).*//' *.conll

[^>] corresponde a tudo, exceto > , por isso <[^>]*> corresponderá a <h> , mas não <h> PIDAT <h> .

    
por 05.07.2018 / 07:27