sed 정규 표현식은 vim 및 perl과 다르게 동작합니까?

sed 정규 표현식은 vim 및 perl과 다르게 동작합니까?

다음은 "test.txt" 샘플입니다.

abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

원하는 출력의 예:

X1yad
X2fad
X3had
X4wad
X5mad

vim에서 작동하게 만들 수 있습니다.

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

Perl에서 작업했습니다.

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

내 최종 정규식에는 두 개의 그룹화가 필요하지만 이 예제 출력에서는 필요하지 않습니다.

sed에서 작동하도록 할 수 없습니다.

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

sed가 제대로 작동하는지 확인하려면,

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

내가 sed에서 뭘 ​​잘못하고 있는 걸까?

답변1

sed이해하지 못하다 \d. 대신에 [0-9]또는 를 더 일반적으로 사용할 수 있습니다 .[[:digit:]]

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

유니코드 는 [[:digit:]]안전하지만 [0-9]그렇지 않습니다.

답변2

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

그것은 이루어져야합니다.

답변3

당신은 sed이 특정한 순서를 이해하지 못합니다 \d. 또는 문자 클래스 \d로 대체 :[0-9][:digit:]

$ cat file.txt
abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

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

$ sed -nr 's/.*(X[0-9])(.*)45.*/\1\2/p' file.txt
X1yad
X2fad
X3had
X4wad
X5mad

관련 정보