에서와 같이예패턴이 포함된 줄 번호를 얻으려고 합니다. 내 패턴에는 슬래시가 포함되어 있으므로 사용자 정의 구분 기호를 추가하고 싶습니다.
이 간단한 접근 방식이 효과적입니다.
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''.