Como faço para extrair fragmentos de texto de um arquivo usando sed?

0

Estou tentando criar um script BASH para extrair fragmentos de texto de um arquivo que tenha muitas linhas semelhantes a esta:

"11","category/subcategory/sub-subcategory/item-1","index.php?option=com_trombinoscopeextended&Itemid=125&lang=es&view=trombinoscope","251","0","0000-00-00","","","","","","","0"

De cada linha eu só tenho que manter o:

category/subcategory/sub-subcategory/item-1

O contexto pode ser excluído. Eu estava tentando usar sed mas não consigo encontrar uma maneira de fazer isso. Não entendo como criar um comando usando a expressão regular que já tenho:

\w+(\/[\w-]+)+

Eu tenho lido e já tentei este comando e outros similares, mas não sei muito sobre isso:

cat file.txt | sed -i -E "s/\w+(\/[\w-]+)+"

Isso definitivamente não está funcionando e não consigo encontrar um guia para iniciantes sobre como usar sed e expressões regulares.

    
por eera5607 21.04.2018 / 23:15

2 respostas

0

Analisar um arquivo como este é melhor feito com awk :

awk -F, '{ print $2 }' file

ou cut ,

cut -d, -f 2 file

Isso lhe daria "category/subcategory/sub-subcategory/item-1" (incluindo as aspas) dos dados que você forneceu.

Com sed e utilizando a expressão regular que você forneceu (mas com \w substituído por [[:alnum:]] ):

sed -E 's@.*,"([[:alnum:]]+(/[[:alnum:]-]+)+)",.*@@' file

Isso substitui a linha inteira pelo bit que corresponde à expressão regular no primeiro conjunto de parênteses. Isso retorna category/subcategory/sub-subcategory/item-1 para os dados que você forneceu.

Para uma análise de arquivos CSV mais geral, incluindo o tratamento correto de citações e campos que podem conter vírgulas ou aspas duplas, use csvkit :

csvcut -c 2 file
    
por 22.04.2018 / 10:52
0

Não há nada errado com o seu regex em si, só que você caiu na armadilha para os incautos. Dentro do [] o \ w são dois literais uma barra invertida e um "w" e NÃO um "\ w" como se poderia pensar que fosse ou como em Perl, de onde é emprestado mas não totalmente.

Uma maneira seria definir explicitamente o que está em \ w e, em seguida, continuar:

sed -Ee '
    /\n/{P;D;}
    s|\w+(/[-_A-Za-z0-9]+)+|\n&\n|;D
'
    
por 22.04.2018 / 10:23