슬래시가 아닌 문자를 하나 이상 일치시키는 방법

슬래시가 아닌 문자를 하나 이상 일치시키는 방법

n 수준 깊이로 내려가는 상대 경로가 주어지고 동일한 수의 수준으로 올라가는 "역방향" 경로를 생성하려고 합니다. 후행 공백이 있든 없든 동일한 수의 레벨을 생성하고 싶습니다. 예를 들어:

dir/subdir/subsubdir  should produce ../../..
dir/subdir/subsubdir/ should produce ../../../

더하기 연산자가 일치하는 항목을 찾지 못하는 이유는 무엇입니까? 슬래시가 아닌 문자가 하나 이상 있다는 뜻이 아닌가요?

$ echo dir/subdir/subsubdir | sed 's|[^/]+|..|g'
dir/subdir/subsubdir

반면 단일 문자 일치와 별 일치가 작동합니다.

$ echo dir/subdir/subsubdir | sed 's|[^/][^/]*|..|g'
../../..

뒤에 슬래시가 있어도:

$ echo dir/subdir/subsubdir/ | sed 's|[^/][^/]*|..|g'
../../../

FWIW에서는 별표(*)가 플러스(+) 대신 작동합니다.

$ echo dir/subdir/subsubdir | sed 's|[^/]*|..|g'
../../..

그러나 후행 슬래시는 다른 레벨을 추가하기 때문에 작동하지 않습니다.

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..

답변1

불행하게도 정규식 구문에는 다양한 변형이 있으며 각 구문에는 약간의(또는 때로는 그다지 작지 않은) 변형이 있습니다. GNU sed를 사용한다고 가정하면 다음 옵션 중 하나가 작동합니다.

$ echo dir/subdir/subsubdir | sed 's|[^/]\+|..|g'
../../..
$ echo dir/subdir/subsubdir | sed -r 's|[^/]+|..|g'
../../..

일반적으로 어떤 도구를 사용하는지 확인하려면 사용 중인 도구의 매뉴얼 페이지를 확인하는 것이 좋습니다.

관련 정보