Procurando por um padrão com condições

1

Eu tenho um arquivo enorme no qual quero procurar uma palavra, digamos pattern . Estou tentando ilustrar meu caso com um exemplo.

Suponha que eu tenha em meu arquivo em algum lugar

Sample-pattern="abc"

Eu quero escrever um script que irá ecoar Sample e abc , ou seja, a palavra que precede o hífen e a palavra dentro das citações

Então, se houvesse

Sample2-pattern="xyz"

echo Sample2 e xyz

Observe que pode haver a palavra pattern nesse arquivo em outro lugar. Mas se a palavra pattern tiver qualquer coisa exceto hífen antes dela, o script deve ignorá-la. Por exemplo, se houver

Sample3pattern.....

deve ignorá-lo.

    
por Aniket Bhattacharyea 03.04.2016 / 16:59

2 respostas

1

Com entrada file.txt :

Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="def"

O script sed a seguir produzirá esta saída:

$ sed -E -n -e '/-pattern/ s/^([^-]*)-[^=]*="([^"]*)"/ /p' file.txt
Sample abc
Sample2 xyz

O script sed acima imprime todo o texto antes do primeiro caractere - em uma linha E todo o texto entre aspas duplas após o primeiro caractere = em uma linha. Ele não imprime linhas que não correspondem às expressões regulares (as duas - a especificação de endereço /-pattern/ e a pesquisa e substituição s/// ).

NOTA: Ele usa a opção -E de sed para ativar expressões regulares estendidas. Isso funciona com GNU, * BSD, Mac OS X e algumas outras versões de sed .... é melhor usar -E do que a opção -r do GNU-ish que faz a mesma coisa, mas não é implementada na versão do Mac OS X de sed . -E provavelmente se tornará um padrão POSIX em um futuro não muito distante.

uma versão de expressão regular básica seria:

sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/ /p'
    
por 04.04.2016 / 04:57
1

Se você tiver acesso ao GNU grep (o padrão no Linux), você pode fazer:

grep -Po '\w+-pattern="[^"]+' file

O -E ativa as Expressões regulares estendidas, que nos fornecem \S , que corresponde a qualquer caractere que não seja espaço em branco. O -o faz com que grep imprima apenas a parte correspondente da linha. A regex em si procura um ou mais caracteres não espaciais ( \S+ ) e, em seguida, -pattern=" e, em seguida, um ou mais caracteres que não são " ( [^"]+ ). Então, dê um arquivo como este:

$ cat file
Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="foo"

O comando grep retornaria isso:

$ grep -Eo '\S+-pattern="[^"]+' file 
Sample-pattern="abc
Sample2-pattern="xyz

Você pode passá-lo por sed para remover -pattern=" :

$ grep -Eo '\S+-pattern="[^"]+' file | sed 's/-pattern="/ /'
Sample abc
Sample2 xyz
    
por 03.04.2016 / 17:05