sed에서 's=.*/=='는 무엇을 합니까? [복사]

sed에서 's=.*/=='는 무엇을 합니까? [복사]

sh 스크립트의 맥락에서 이것을 보고 sed 's=.*/=='혼란스럽습니다. sed 매뉴얼이나 웹 검색에서 대신 사용하는 sed s=방법을 찾을 수 없습니다 . 여기에는 하나의 잠재적인 명령만 표시되지만 ( 현재 입력 줄 번호 인쇄) 이 경우 나머지 명령은 무엇을 수행합니까?ss///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##*/}몇 배 더 빠릅니다.$variablesed

변수 대체 및 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

여기서 =정규식(.*/) 및 교체(유효하지 않은).

관련 정보