sh 스크립트의 맥락에서 이것을 보고 sed 's=.*/=='
혼란스럽습니다. sed 매뉴얼이나 웹 검색에서 대신 사용하는 sed s=
방법을 찾을 수 없습니다 . 여기에는 하나의 잠재적인 명령만 표시되지만 ( 현재 입력 줄 번호 인쇄) 이 경우 나머지 명령은 무엇을 수행합니까?s
s///
s
=
셸에서 이 명령을 실행하면 매뉴얼에 따라 대체된 내용 echo 'jkfdsa=335r34'
과 함께 에 대한 입력과 동일한 출력이 생성됩니다 . echo 'jkfdsa=335r34' | sed 's/=.*/==/'
또한 명령을 echo 'jkfdsa=3' | sed 's798=.*/==/'
gets 로 약간 수정하여
sed: -e expression #1, char 11: unterminated 's' command
원본의 의미가 정확해야 합니다. 그것은 무엇입니까?
답변1
대체 구분 기호 입니다 =
. 이는 패턴에 /
(더 일반적으로 사용되는 구분 기호)가 포함되어 있기 때문에 사용됩니다. 거의 모든 문자를 대체 구분 기호로 사용할 수 있으므로 동일한 의미를 s@.*/@@
갖습니다 . s_.*/__
일반 구분 기호를 사용하면 sed
표현식은 다음과 같이 작성할 수 있습니다.
s/.*\///
(표현식이 일치시키려는 텍스트를 /
여기에서 이스케이프해야 합니다.) 또는 더 읽기 쉬운 경우
s/.*[/]//
(문자 클래스의 대부분의 문자는 리터럴1[...]
입니다 .)
이 표현식의 역할은 일치하지 않는 sed
항목을 바꾸는 것입니다 . 이렇게 하면 마지막 문자까지 포함하여 줄의 모든 항목이 삭제되는 효과가 .*/
있습니다 . /
가장 많이 제거됩니다마지막 /
.*
(첫 번째 항목은 아님) 모든 문자 시퀀스에 대한 탐욕스러운 일치 로 인해 발생합니다 .
예:
$ echo 'a/b/c' | sed 's/.*[/]//'
c
unterminated 's' command
테스트 중 오류
s798=.*/==/
명령 구분 기호 로 7
사용됩니다 . s
표현 방식
s7.*/77
그러나 그것은 작동할 것이다.
1 ... (처음에) 및 (첫 번째가 아닌 경우, 두 번째 뒤 또는 마지막) 과 같은 특별한 의미가 있는 문자는 제외됩니다 . 및 의 문자에는 특별한 처리가 필요 하지만 이는 이 질문의 범위를 벗어납니다.[...]
^
-
^
[
]
[...]
문자열이나 쉘 변수의 경로 끝에 있는 파일 이름을 가져오는 데 이 유틸리티가 사용된 경우 이 basename
유틸리티는 더 나은 작업을 수행할 수 있습니다(경로가 슬래시로 끝나는 경우에도 올바른 작업을 수행합니다).
$ basename a/b/c
c
$ basename a/b/c/
c
다시 말하지만, 변수에 개행 문자가 포함되어 있지 않다고 가정하면 표준 쉘 매개변수 대체는 명령 대체에서 위 표현식을 통해 값을 전달하는 것과 동일한 효과를 갖지만 ${variable##*/}
몇 배 더 빠릅니다.$variable
sed
변수 대체 및 basename
유틸리티도 개행 문자가 포함된 경로 이름을 올바르게 처리하지만 이는 sed
작동하지 않습니다(입력을 한 줄씩 처리하기 때문입니다).
답변2
~에서https://backreference.org/2010/02/20/using- Different-delimiters-in-sed/:
sed가 "s" 명령의 구분 기호로 모든 문자를 사용할 수 있다는 것은 잘 알려지지 않은 사실입니다. 기본적으로 sed는 "s" 이후의 모든 항목을 구분 기호로 처리합니다.
따라서 가운데 슬래시는 일반 문자가 됩니다. 내 해석이 맞다면 당신의 표현은 다음과 같습니다.
s=.*/==
다음과 같이 작성할 수도 있습니다.
s/.*\///
"슬래시를 포함하여 마지막 슬래시 앞의 모든 항목을 제거"하는 것으로 해석됩니다.
답변3
그것은 /
이전과 그 자체의 모든 것을 탐욕스럽게 삭제합니다.
예:
echo "nsi/wnx/cmedwcm" | sed 's=.*/=='
산출:
cmedwcm
여기서 =
정규식(.*/) 및 교체(유효하지 않은).