sed expressão regular se comportando de forma diferente do que em vim e perl?

2

Aqui está um exemplo de 'test.txt'

abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

amostra da saída desejada:

X1yad
X2fad
X3had
X4wad
X5mad

Eu poderia trabalhar com ele em:

:% s/\v.*(X\d)(.*)45.*//

e trabalhou em perl também com:

open(my $file, "<", "test.txt");
while(<$file>)
{
    s/.*(X\d)(.*)45.*/$1$2/; 
    print $_;
}

minha eventual expressão regular precisa de dois agrupamentos, não foi necessária para este exemplo de saída

não consigo trabalhar com o sed:

sed -r 's/.*(X\d)(.*)45.*//' test.txt
abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

apenas para verificar se o sed está funcionando,

sed -r 's/(a)/##/' test.txt
#a#bcdX1yad45das
#a#bcdX2fad45das
#a#bcdX3had45das
#a#bcdX4wad45das
#a#bcdX5mad45das

o que estou fazendo errado em sed?

    
por Sundeep 27.04.2016 / 07:10

3 respostas

5

sed não entende \d . Você pode usar [0-9] ou, mais geralmente, [[:digit:]] em seu lugar:

$ sed -r 's/.*(X[[:digit:]])(.*)45.*//' test.txt
X1yad
X2fad
X3had
X4wad
X5mad

Observe que [[:digit:]] é seguro para unicode, mas [0-9] não é.

    
por 27.04.2016 / 07:17
1
sed 's/abcd\(X[0-9][a-z]ad\)45das//g' your_file_name

deve fazer isso.

    
por 27.04.2016 / 07:26
0

Você sed não entende a sequência especial \d . Substitua \d por [0-9] ou classe de caractere [:digit:] :

$ cat file.txt
abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

$ sed -nr 's/.*(X\d)(.*)45.*//p' file.txt   

$ sed -nr 's/.*(X[0-9])(.*)45.*//p' file.txt
X1yad
X2fad
X3had
X4wad
X5mad
    
por 27.04.2016 / 07:16