Eu tenho um arquivo alphanum
com estas duas linhas:
123 abc
this is a line
Estou confuso sobre o motivo pelo qual, quando executo sed 's/[a-z]*/SUB/' alphanum
, recebo a seguinte saída:
SUB123 abc
SUB is a line
Eu estava esperando:
123 SUB
SUB is a line
Encontrei uma correção (use em sed 's/[a-z][a-z]*/SUB/'
vez disso), mas não entendo por que ela funciona e a minha não.
Você pode ajudar?
sed
regular-expression
Fakher Mokadem
fonte
fonte
ls foo*
lá usa). Mas, de qualquer maneira, se você encontrar perguntas duplicadas, acho que também poderá sinalizá-las como tal.Respostas:
O padrão
[a-z]*
corresponde a zero ou mais caracteres no intervaloa
paraz
(os caracteres reais dependem da localidade atual). Existem zero desses caracteres no início da string123 abc
(ou seja, o padrão corresponde) e também quatro deles no início dethis is a line
.Se você precisar de pelo menos uma correspondência, use
[a-z][a-z]*
ou[a-z]\{1,\}
, ou ative expressões regulares estendidas comsed -E
e use[a-z]+
.Para visualizar onde o padrão corresponde, adicione parênteses em torno de cada correspondência:
Ou, para ver todas as correspondências nas linhas:
Compare esse último resultado com
fonte
[a-z]
jogos em elementos que podem ser feitas de mais de um personagem. Por exemplo, em alguns locais húngaros,[a-z]
jogos emdzs
Porque
*
corresponde a zero ou mais repetições do átomo anterior, e todos os mecanismos de expressão regular tentam encontrar a primeira correspondência. Há uma subcadeia de exatamente zero letras no início da sua string, então é aí que ela corresponde. No caso em que a sequência começa com uma letra,*
corresponde ao maior número possível, mas isso é secundário para encontrar a correspondência mais à esquerda.Correspondências de comprimento zero podem ser um pouco problemáticas e, como você viu, a solução é modificar o padrão para que exija pelo menos um caractere. Com regexes estendidas, você pode
+
:sed -E 's/[a-z]+/SUB/'
Por diversão, tente:
fonte