sed 명령에서 "/" 사용을 이해해야 합니다.

sed 명령에서 "/" 사용을 이해해야 합니다.

sed 명령에 대해 알고 싶습니다

예를 들어 다음 명령이 있습니다.

rtNum=`pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'`

그리고

rtRun=`pwd | sed -e 's/^.*bbsp.\/rt.*\///'`

여기서 pwd는 다음과 같습니다. /tfsrun/bbsp2/rt3/run 생성되는 출력은 다음과 같습니다.

echo $rtNum 
3

그리고

echo $rtRun 
run

-e위 sed 명령, 특히 위 sed 명령에서 /, // 및 ///의 사용 및 사용법을 이해하고 싶습니다.

답변1

매뉴얼에 명시된 대로 이 -e옵션은 스크립트가 뒤따른다는 것을 나타냅니다. 스크립트는 정규식을 사용하여 일치하는 콘텐츠를 빈 문자열로 바꿉니다.

정규식을 이해하려면 다음을 읽는 데 충분한 시간을 할애하는 것이 좋습니다.https://www.tutorialspoint.com/unix/unix-regular-expressions.htm

귀하의 질문에 : \/슬래시가 이스케이프 처리되어 있습니까? 이는 구분 기호로 처리되지 않음을 의미합니다. /일치 문자열과 대상 문자열을 구분하는 구분 기호입니다.

예를 들어 's/matchingstring/targetstring/'s 호출은 일치하는 문자열의 첫 번째 항목을 대상 문자열로 바꿉니다.

귀하의 경우:

  • '//'구분 기호 사이에 아무것도 없기 때문에 대상 문자열이 비어 있음을 나타냅니다.
  • '///'실제로 그렇습니다. '\///'이는 일치 문자열이 슬래시로 끝나고 대상 문자열이 비어 있음을 의미합니다.

답변2

-eto 플래그는 sed"이것을 실행/실행"하는 방법입니다. sed동일한 호출에서 여러 편집 명령을 실행 하려면 이 명령이 필요합니다 sed( 로 구분하지 않는 한 ).;

예를 들어, 파일에서 1행과 20~30행만 추출/인쇄하려면(이 -n플래그는 각 입력 행의 기본 출력을 끕니다):

$ sed -n -e '1p' -e '20,30p'

에서는 sed단일 슬래시( )를 사용하여 정규식을 구분합니다./

예를 들어, 같은 줄에서 "hello" 문자열 뒤에 "word"가 오는 모든 줄을 삭제합니다.

$ sed '/hello.*world/d'

때로는 대체 항목에 이중 슬래시가 표시될 수 있습니다. 명령 실행은 정규식과 일치하는 콘텐츠를 문자열로 s바꿉니다 .sed

s/pattern/replacement/

의도라면삭제패턴과 일치하는 것, 교체는 비어 있을 것이고 우리는 다음과 같이 끝날 것입니다.

s/pattern//

삼중 슬래시( ///)는 패턴을 제거하려는 누군가에게서 나온 것입니다.슬래시로 끝나다. 슬래시는 구분 기호로 사용되므로 첫 번째 슬래시는 다음과 같습니다.탈출하다백슬래시( )로 \/구성됩니다 \///. "이스케이프 처리됨"은 "구분 기호가 아닌 문자 그대로의 문자로 처리됨"을 의미합니다.

대체 작업을 수행할 때 어색한 슬래시 문제를 해결하는 방법에는 여러 가지가 있습니다 sed. 대안을 택하다

s/\///

/이렇게 하면 각 행의 첫 번째 행이 제거됩니다(실제로는비어있는 것으로 교체).

또 다른 방법은 글쓰기이다.

s/[/]//

슬래시를 문자 그룹에 넣거나대괄호 표현. 이러한 그룹의 모든 문자는 항상 리터럴 문자로 처리됩니다 sed. 대괄호 표현식만 일치합니다.하나문자는 거기에 나열된 문자를 초과합니다.

또 다른 방법은 다른 구분 기호를 사용하는 것입니다.

s#/##

여기서 #문자는 구분 기호 역할을 합니다(모든 문자를 선택할 수 있음). #구분 기호로 사용될 때 a를 일치시키 려면 기본 구분 기호를 사용할 때와 마찬가지로 또는 중 하나를 #사용해야 합니다.\#[#]/

그럼 sed명령줄을 확인해 보세요.

sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'

이렇게 하면 두 가지 편집 작업이 수행됩니다.

  1. s/^.*bbsp.\/rt// 또는 s#^.*bbsp./rt##
  2. s/\/.*$// 또는 s#/.*$##

둘 다 교체( s의 편집 명령 sed)이며 둘 다 일치하는 패턴을 아무것도 바꾸지 않습니다. 즉, 둘 다 입력에서 무언가를 제거합니다.

첫 번째 패턴은 ^.*bbsp.\/rt줄의 시작 부분( ^)에서 시작하여 임의 개수의 문자( .*), 문자열 bbsp, 기타 문자( .) 및 문자열이 뒤따르는 것과 일치합니다 /rt.

따라서 모든 문자를 나타내는 after /rt를 포함하여 해당 줄의 모든 내용을 삭제하는 것처럼 보입니다 .bbsp..

두 번째 패턴은 a부터 줄 끝까지( )까지 일치 \/.*$합니다 ./$

그래서 한 줄의 텍스트가 주어졌습니다.

/tfsrun/bbsp2/rt3/run

첫 번째 대체는 다음과 같이 바뀔 것입니다.

3/run

두 번째는 그것을 다음과 같이 바꿀 것입니다.

3

답변3

여기 당신의 견적이 있습니다man sed

-e 스크립트, --expression=스크립트

  add the script to the commands to be executed

s/정규식/교체/

  Attempt to match regexp against the pattern space.  If successful, replace  
  that  portion  matched  with  replacement.  The replacement may contain the
  special character & to refer to that portion of the pattern space which
  matched, and the special escapes \1 through \9 to refer to the corresponding
  matching sub-expressions in the regexp.

관련 정보