이와 같은 문자열이 있고 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