사용자 정의 정규식 구분 기호를 사용하여 패턴이 포함된 줄 번호 찾기

사용자 정의 정규식 구분 기호를 사용하여 패턴이 포함된 줄 번호 찾기

에서와 같이패턴이 포함된 줄 번호를 얻으려고 합니다. 내 패턴에는 슬래시가 포함되어 있으므로 사용자 정의 구분 기호를 추가하고 싶습니다.

이 간단한 접근 방식이 효과적입니다.

sed -n '/file/=' temp.txt

구분 기호를 사용한 문자열 교체도 가능합니다.

sed 's|file|gile|' temp.txt

하지만 첫 번째 예에서 구분 기호를 추가하려고 하면 다음과 같이 되지 않습니다.

sed -n '|file /etc|=' temp.txt

슬래시를 피할 수 있다는 것을 알고 있지만 사용자 정의 구분 기호를 추가하고 싶습니다. 내 명령을 수정하는 방법을 아시나요?

답변1

스티븐당신을 위한해결책 sed:

sed -n  '\|file /etc|=' file 

다른 도구를 사용하고 싶다면 이 방법도 가능합니다.

grep -n 'file /etc' file

줄 번호만 얻으려면 줄 자체도 인쇄합니다.

grep -n 'file /etc' file | cut -d: -f 1

또는 다음을 사용할 수 있습니다 perl.

perl -lne 'm|file /etc| && print $.' file 

또는 awk:

awk '$0 ~ "file /etc" {print NR}'

답변2

모든 컨텍스트 주소에서 이스케이프해야 합니다.열리는/이후에 나오는 이스케이프 문자는 닫는 구분 기호가 아닌 리터럴 문자로 처리됩니다 .

  • 기본 구분 기호:

    /start/,/end/{/pattern/d;}
    
  • 맞춤 구분 기호:

    \#start#,\#end#{\#pattern#d;}
    

보다POSIX 문서:

컨텍스트 주소에서 구조 \cREc(여기서 c는 백슬래시나 개행 문자를 제외한 모든 문자)는 /RE/와 동일합니다. c로 지정된 문자가 백슬래시 뒤에 나타나면 해당 문자는 리터럴 문자로 간주되어 RE를 종료하지 않습니다. 예를 들어, 컨텍스트 주소 \xabc\xdefx에서 두 번째 x는 자신을 나타내므로 정규식은 abcxdef입니다.

GNU 페이지의 유사한 설명 sed man:

/regexp/
       Match lines matching the regular expression regexp.      
\cregexpc
       Match lines matching the regular expression regexp.  
       The c may be any character.

그리고 FreeBSD sed man페이지:

In a context address, any character other than a backslash (``\'')
or newline character may be used to delimit the regular expression.
The opening delimiter   needs to be preceded by a backslash unless it
is a slash.  For example, the   context address \xabcx is equivalent
to /abc/.  Also, putting a backslash character before   the delimiting
character within the regular expression causes the character to be
treated literally.  For example, in the context address \xabc\xdefx,
the RE delimiter is an ``x'' and the second ``x'' stands for itself,
so that the regular expression is ``abcxdef''.

관련 정보