Como executo uma correspondência de regex em um arquivo

0

Como faço para executar uma correspondência de regex em um arquivo e gerar o resultado.

Por exemplo, encontre version="X.Y.Z"e armazene em uma variável o resultado correspondente de XYZ para poder ecoar a correspondência posteriormente.

O é tanto quanto eu consegui sozinho: sed -n -e / versão \ = \ ". * \" '$ PATH "version.js"

O conteúdo do meu arquivo é:

var config;
function check() {
    if (window.environment && window.revision) {
        config.version = "0.0.1";
        config.isApp = true;
    }
    else {
        setTimeout(check);
    }
}
check();

e desejo armazenar 0.0.1em uma variável como desejo inserir esse valor em outro arquivo.

Baz
fonte
Você pode esclarecer qual saída você está canalizando (presumo) para o sed? Os arquivos que você está procurando em uma pasta? é a versão no nome do arquivo ou no próprio arquivo?
Kyze
@kyze eu tenho apenas um arquivo que gostaria de tubulação em: $ PATH "version.js"
Baz
Tudo bem, então você está produzindo o conteúdo do arquivo e pesquisando regex o conteúdo? Um cat version.js | grep ...não faria o truque neste caso?
Kyze
@kyze Eu sou muito novo no bash, então vou explorar sua sugestão, obrigado!
Baz
Se você der um exemplo de conteúdo do arquivo, i (e outros também) poderão ajudá-lo.
Kyze

Respostas:

1

Isso deve estar funcionando no seu caso:

cat /path/to/version.js | grep config.version | grep -P -o '\d\.\d\.\d'

Se seu número for de dois dígitos (ou mais), você precisará adicionar um + ao \ d correspondente ao número.

Como '\d\.\d\.\d'correspondências, 1.1.1, 1.1.2, 2.2.9etc., não corresponderia 1.10.2, o regex precisaria ser modificado para '\d\.\d+\.\d'.

Você pode seguir o caminho "fácil / seguro" e apenas colocar '\d+\.\d+\.\d+'.

A saída do primeiro seria apenas o número da sua versão, que poderia ser definida como uma variável depois.

Como uma edição do seu comentário: Isso funciona corretamente para mim. Eu criei um arquivo com suas entradas, grepping isto com meu comando produz isto:

insira a descrição da imagem aqui

Usando isso para definir uma variável como tal, o eco também funciona:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

kyze
fonte
Obrigado pela sua ajuda @kyze. Eu tentei: temp = $ (cat $ BUILD_PATH "config.js" | grep config.version | grep -P -o '\ d \. \ D \. \ D') echo $ temp, mas não funcionou. Eu também tentei temp = $ (cat $ BUILD_PATH "config.js" | grep config.version) e ele gera config.version = "0.0.1";
Baz
Meu grep é o seguinte: --color = when] [--context [= num]] [--diretórios = action] [--label] [--line-buffered] [--null] [pattern] [file ...]
Baz
Ah, funciona se eu remover a flag P e usar asterisco em vez de mais.
Baz
Funciona se você remover o -P? Isso não deveria estar acontecendo, como grep padrão não pode interpretar o \ d regex e precisaria de [[: digit:]]
kyze
Ok, estranho. Estou usando o GNU bash, versão 3.2.57 (1) -release (x86_64-apple-darwin16). Agora, meu grep é $ (cat $ BUILD_PATH "config.js" | grep config.version | grep -o '\ d * \. \ D * \. \ D *')
Baz