일치하기 전에 줄의 시작 부분을 건너뛰도록 정규식에 지시합니다.

일치하기 전에 줄의 시작 부분을 건너뛰도록 정규식에 지시합니다.

이와 같은 문자열이 있고 45mb ./aaaa/bbbb/cccc/dddd이와 같은 정규식을 사용하면 [^\/]*\/일치합니다.45mb ./aaaa/bbbb/cccc/

그냥 일치시키고 싶은데 ./aaaa/bbbb/cccc/방법을 모르겠어요.

sed아래 명령에서 일치 항목을 바꾸는 데 사용하고 싶지만 sed처음에는 파일 크기 비트를 잃지 않고 슬래시 이전의 모든 항목, 슬래시를 포함하는 모든 항목을 구체적으로 일치/찾고 싶습니다.

sed -e 's/[^\/]*\//--/g

이것이 의미가 있기를 바랍니다. 앞으로/뒤로 찾아보았지만 이것이 올바른 정규식 솔루션인지 모르겠습니다.

답변1

Gnouc의 답변에 대한 의견에서 원하는 것을 명확히 했으므로 해결책은 다음과 같습니다.

sed 's|[^ /]*/|--|g'

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|[^ /]*/|--|g'
45mb --------dddd

뒤에 슬래시가 있거나 전달하는 파일 경로에 공백이 포함되어 있으면 중단됩니다. 좀 더 빈틈없는 스크립트를 작성하는 것은 매우 쉽지만 한 줄 이상의 내용이 필요합니다.


캡처 그룹을 사용하는 솔루션은 다음과 같습니다.

sed -e 's|\([^ ]* \).*/\(.*\)|\1\2|'

s를 구분 기호로 사용하는 이유는 슬래시를 이스케이프 처리할 필요가 없기 때문입니다(그러나 패턴에서 s를 |이스케이프해야 함 ). |AFAIK sed거의 모든 문자를 구분 기호로 사용할 수 있습니다.

첫 번째 캡처 그룹은 \([^ ]* \)"공백을 제외한 모든 문자와 공백이 뒤에 오는 문자"와 일치합니다. .*/"슬래시가 오는 모든 문자 수"와 일치 하고 두 번째 그룹은 \(.*\)"모든 문자 수"를 캡처합니다.

Sed의 정규식(및 대부분의 정규식)은 기본적으로 탐욕적이므로 .*/해당 패턴과 일치하는 가장 긴 문자열과 일치합니다.

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb dddd

그러나 뒤에 슬래시가 있으면 중단됩니다.

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb 

이 버전~ 할 것이다이는 후행 슬래시에서도 작동하지만 슬래시가 여러 개 있으면 중단됩니다.

sed -e 's|\([^ ]* \).*/\(.\)|\1\2|'

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb dddd/
$ echo '45mb ./aaaa/bbbb/cccc/dddd//' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb /

답변2

정규식과 Perl을 사용하는 솔루션은 다음과 같습니다.

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ne 'print $1 if /(\.\/.*\/)/'
./aaaa/bbbb/cccc/    

그리고 다음을 교체하세요:

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ple 's/(\.\/.*\/)/--/'
45mb --dddd

관련 정보