나는 몇 가지 유용한 정규식 주석을 가지고 있는데, 내가 자주 사용하는 주석은 다음과 같습니다.
echo '/home/user/folder/file.txt' | sed -E 's/[\\\/][^\\\/]*$//g'
이 정규식에서 얻은 결과는 상위 폴더의 경로입니다 /home/user/folder
. 정규식의 기본 사항을 이해합니다.
\s # all white space
\S # no white space
. # all chars
\. # period
+ # sequence of once or more
{5} # sequence of delimited interval
* # sequence of zero or more
? # sequence of once or none
[0-9] # any sequence of number
[a-z] # any sequence of letter
[^x-y] # no sequence of letter
^ # beginning
$ # ending
그러나 나는 정규식에서 중화의 의미가 무엇인지 내 예에서 파악하지 못했습니다 [\\\/]
. [^\\\/]
어떻게 작동하나요?
답변1
[\\\/]
이스케이프 문자 \
와 이스케이프 문자가 포함되어 있습니다 /
(여기서는 문자를 이스케이프할 필요가 없습니다). [abc]
일치 a
또는 b
또는 c
, [\\\/]
일치 \
또는 과 같습니다 /
.
[^\\\/]
다소 유사하지만 ^
처음에 특별한 반전이 있습니다 []
. 즉, 의미를 부정합니다. [^\\\/]
임의의 문자와 일치다른또는 .\
/
[\\\/][^\\\/]*$
\
또는 와 일치하고 /
줄 끝까지 0개 이상의 다른 문자와 일치합니다. 귀하의 s
명령은 일치하는 문자열을 아무것도 바꾸지 않습니다. 전체 sed 명령은 마지막 항목 \
이나 마지막 항목 /
(둘 중 나중에 있는 항목)과 그 이후의 모든 항목을 삭제합니다.
노트:
-E
이 특정 명령은 작동할 필요가 없습니다.g
필요하지 않습니다(한 줄에서 두 줄 이상의 끝을 찾을 수 없습니다).- (이미 지적함)
/
안으로 탈출할 필요는 없습니다.[]
(외부 이스케이프는/
일반적으로 필요하지 않습니다. 사람들이 특별히 에서 구분 기호로 선택하기 때문에 일반적으로 필요하지만 예를 들어 다른 문자일 수도 있습니다.)[]
/
s/…/…/
s|…|…|
/
귀하의 명령은 Unix 경로 이름(comments 로 구분됨 )과 DOS/Windows 경로 이름(comments 로 구분됨 ) 모두에서\
마지막 구성 요소를 제거한다는 점에서 "범용"인 것으로 보입니다 . 하지만…\
Unix 경로 이름에 나타날 수 있습니다. 그렇다면 sed 명령으로 인해 예상치 못한 결과가 나타날 수 있습니다. 줄 바꿈도 허용됩니다./
유효한 경로 이름이고상위 디렉토리는 다음과 같습니다./
. 그러나 sed 명령은 빈 문자열을 생성합니다.dir
디렉토리인 경우에는/path/to/dir/
동일/path/to/dir
하지만 sed 명령은/path/to/dir
각각/path/to
.