Como remover o texto antes do delimitador?

Como remover o texto antes do delimitador?

Preciso de ajuda para remover texto antes );e depois |dos delimitadores em todas as linhas de um arquivo de texto. Ou seja:

 SUBSCIBER_MSISDN=6289666195060');BEGIN DBMS_LOCK.SLEEP(5); END-- rKSy|

E o resultado deveria ser assim

SUBSCIBER_MSISDN=6289666195060|

Alguma ideia de como remover essa parte? É um arquivo grande.

Eu vou enlouquecer se precisar usar sed.

Responder1

Supondo que o que você está mostrando seja uma linha completa de algum arquivo de entrada:

sed "s/'.*/|/" file >newfile

Isso substituiria tudo após o primeiro 'caractere de cada linha por um |caractere. O resultado seria gravado em um novo arquivo por meio de um redirecionamento. Estou usando aspas duplas em torno da sedexpressão, pois uma string entre aspas simples nunca pode conter um caractere de aspas simples.

Dados os dados de exemplo, isso produziria

 SUBSCIBER_MSISDN=6289666195060|

Se você também deseja remover espaços em branco do início da linha (seu exemplo parece fazer isso):

sed -e "s/'.*/|/" -e 's/^[[:blank:]]*//' file >newfile

ou,

sed "s/'.*/|/; s/^[[:blank:]]*//" file >newfile

Se você tem aversão a sed, você pode empregar awkpara fazer exatamente a mesma transformação:

awk '{ sub("'"'"'.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

A aparência descolada '"'"'é uma citação simples. Deve estar entre aspas duplas fora da string entre aspas simples que constitui o awkcódigo. Também poderíamos usar '\'', ou seja

awk '{ sub("'\''.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

Ou você pode usar o código ASCII octal para o caractere de aspas simples:

awk '{ sub("\047.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

informação relacionada