Expressão Regex complicada

2

Alguém poderia me explicar o que esse regex substitui:

\([^:]*\):\(.*\)

Obrigado antecipadamente

    
por Med 19.10.2017 / 10:49

3 respostas

2

Este regex é geralmente usado para extrair nomes de usuários do arquivo /etc/passwd . Por exemplo

sed 's/\([^:]*\):\(.*\)//' /etc/passwd

Retornará os nomes de usuário somente da passwd password.

1st Capturing Group ([^:]*)

Match a single character not present in the list below [^:]*
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
: matches the character : literally (case sensitive)
: matches the character : literally (case sensitive)
2nd Capturing Group (.*)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times 

Então, em termos simples.

Primeira parte:

    sed 's/\([^:]*\):    
          /\([^:]*\): Match the string till you see a colon ':' and group.

Segunda parte:

   sed \(.*\)//' /etc/passwd
       \(.*\)  Match everything after ':' and group

Agora temos dois grupos em que podemos back-reference usando , o que indica que queremos fazer referência ao primeiro grupo e imprimir esses resultados.

    
por 19.10.2017 / 11:15
1

Isso provavelmente está removendo apenas o primeiro cólon em uma string.

sed 's/\([^:]*\):\(.*\)//' <<<"Hello:Unix:Users"
HelloUnix:Users

Este \([^:]*\) corresponde a qualquer coisa até que não seja dois pontos (ou até que um cólon não seja visto).

Em seguida, corresponda ...\):\(... aos dois pontos. e tudo \(.*\) depois disso. Mas quando \(..\) é usado, isso indica sed para capturá-los como um grupo de correspondência e seu índice correspondente (ou em main back-references ) para o primeiro será e para o próximo e etc.

Eu mencionei provavelmente, porque quem quiser usá-los na parte de substituição sed é importante, talvez ele / ela queira substituir o primeiro cólon por ponto-e-vírgula.

sed 's/\([^:]*\):\(.*\)/;/' <<<"Hello:Unix:Users"

Ou talvez queira adicionar outra string entre dois pontos:

sed 's/\([^:]*\):\(.*\)/ Linux and /' <<<"Hello:Unix:Users"

Ou o que você pode fazer e substituir:)

    
por 19.10.2017 / 10:54
1

Esta regex não executa a operação de substituição, isto é apenas regex sem contexto.

Precisa saber o comando completo. Mas posso supor que esse padrão esteja de acordo com:

(any symbol except : repeated zero or more times):(any symbol remeated zero or more times)

Assim, você pode obter um nome de usuário de /etc/passwd com esse padrão.

Com sed você pode usar a opção -r para omitir () e seu padrão será mais simples. Insira seu padrão em // \ 1 / ':

sed -r 's/([^:]*):(.*)//' /etc/passwd

A saída será:

root
daemon
bin
sys
sync
games
    
por 19.10.2017 / 10:54