Criando o padrão regexp para grep

0

Portanto, tenho uma string como LST = fr, de, pl, ru, ch, us, uk, ca . Aqui eu tenho que criar um padrão regex para a operação futura do grep, então para isso eu tenho que modificar minha string para combinar assim fr\|de\|pl\|ru\|ch\|us\|uk\|ca

set LST = 'grep "^LST *=" /remote/file/config.ini | sed 's/LST *= *//' | sed 's/ *//g' | tr , "\|"'

Infelizmente tr , "\|" não substitui determinados caracteres para criar meu padrão regexp ... o resultado é frdeplruchusukca . Como faço para criar um padrão regex ou como posso (por exemplo) encontrar a ocorrência de de e definir o valor encontrado para minha variável LST?

exemplo de config.ini

; sample of ini file
[SITE_PREF]

LST = fr, de, pl, ru, ch, us, uk, ca
TASKLIST = T1,TT3,TT0
    
por PYPL 20.09.2016 / 09:50

5 respostas

1

Ok, primeiro, tr funciona um caractere por vez, não é possível substituir um , por um \| (de um a dois caracteres). Então, use sed : sed -e 's/,/\|/'

Dois, você pode combinar o grep e o sed s, isso parece funcionar no Bash, com o GNU sed:

$ LST=$(sed -n '/^LST *=/ {s/^LST *= *//; s/, */\|/g; p}' config.ini)
$ echo "$LST"
fr\|de\|pl\|ru\|ch\|us\|uk\|ca

(Isso basicamente diz: Em todas as linhas que combinam /^LST *=/ , faça as coisas entre chaves: dois s ubstitutions e p rint a linha.)

Três, com o seu tr , você deve ter as vírgulas alteradas para barras invertidas ou canos, dependendo se a cotação funciona ou não, ou seja,

$ echo "fr,de,pl" | tr , "\|" 
fr|de|pl
$ echo "fr,de,pl" | tr , '\|'
fr\de\pl

Mas você não fez nada em vez disso. Não consigo reproduzir isso com o Bash, mas a sintaxe set parece com csh e obtenho um comportamento estranho com tcsh . Em alguns casos. Nem todos.

Ok:

$ tcsh
> echo "fr,de,pl" | sed 's/,/\|/'
fr\|de,pl
> set LST = 'echo "fr,de,pl" | sed 's/,/\|/''
> printf "%s\n" "$LST"
fr\|de,pl

Não tão bem:

$ tcsh 
> echo "fr,de,pl" | sed 's/, */\|/'
fr\|de,pl
> set LST = 'echo "fr,de,pl" | sed 's/, */\|/''
> printf "%s\n" "$LST"
fr|de,pl

A única diferença que consigo ver é o asterisco no segundo caso.

    
por 20.09.2016 / 10:33
1

com awk :

... | awk -F'= ' '{gsub(", ", "\|", $2); print $2}'
  • -F '= ' define o separador de campo como =

  • gsub(", ", "\|", $2) substitui todo o , por \| no segundo campo no lugar

  • print $2 imprime o segundo campo

Exemplo:

$ awk -F'= ' '{gsub(", ", "\|", $2); print $2}' <<<'LST = fr, de, pl, ru, ch, us, uk, ca'
fr\|de\|pl\|ru\|ch\|us\|uk\|ca
    
por 20.09.2016 / 10:10
1

fr\|de\|pl\|ru\|ch\|us\|uk\|ca não é padrão / portável como um regexp para o grep, no entanto:

fr
de
pl
ru
ch
us
uk
ca

Isso é com os itens delimitados com nova linha, é padrão e também pode ser usado com grep -F para pesquisa de cadeia fixa (para que você não tenha problemas se os termos de pesquisa contiverem operadores regexp).

Então você pode fazer (aqui usando a sintaxe do shell POSIX, você não quer usar csh para scripting):

search_term=$(
  sed '
    /^LST *= */!d
    s///
    s/ *, */\
/g' config.ini
)

grep -F -- "$search_term" some-file

Se a implementação de grep oferecer suporte, você também poderá passar a opção -w para pesquisar apenas palavras inteiras.

    
por 20.09.2016 / 10:40
0

LST=$(grep "^LST *=" /remote/file/config.ini| sed -e 's/LST *= *//' -e 's/, */\|/g')

    
por 20.09.2016 / 10:05
0
perl -p0E '($_)= /LST = (.*)/; s/, /\|/g' config.ini
    
por 20.09.2016 / 16:33