grep 등을 사용하여 텍스트 문서의 어떤 줄이 패턴과 일치하는 특정 단어인지 알아낼 수 있는 방법이 있습니까? 감사해요.
답변1
-n
예, 옵션이 있습니다 grep
.
~에서man grep
:
-n, --line-number
Prefix each line of output with the 1-based line number within its input file.
예를 들어 다음과 같은 파일이 있는 경우 file.txt
:
this is
foo test
and this is
bar test
전류 출력 grep -n "test" file.txt
:
$ grep -n "test" file.txt
2:foo test
4:bar test
여기서 2와 4는 패턴이 발견된 줄 번호를 나타냅니다.
답변2
이 grep
방법은 가장 간단하지만 일치하는 줄의 줄 번호를 인쇄합니다 pat
.
진주
perl -lne 'print $. if /pat/' file
앗
awk '/pat/{print NR}' file
sed
sed -n '/pat/=' file
답변3
사용행복하다(이전 Perl_6)
raku -ne 'state $i=0; ++$i; put $i if /pat/;'
위의 Raku 코드는 일치하는 줄의 줄 번호를 pat
각 일치 항목마다 하나씩 인쇄합니다. 모든 일치 항목을 한 줄에 표시하려면 put $i
로 바꾸십시오 print "$i "
.
설명하자면, Perl의 많은 특수 변수가 Raku에서 생략되었습니다. 대조적으로, Raku는 state
변수가 한 번만 시작되도록 허용합니다. 이 구문과 세미콜론으로 구분된 "C와 유사한" 구문은 Raku의 조건부 줄 번호 매기기에 사용할 수 있습니다. 위의 첫 번째 문에서는 $i
키워드를 사용하여 변수를 선언했는데 state
, 이는 변수가 한 번 초기화된다는 의미입니다. 이 state
키워드는 기존 Perl/Raku 명령줄 플래그와 원활하게 작동하므로 -ne
두 $i
번째 문에서 increment를 사용할 수 있고 ++$i
세 번째 문과 일치하는 값을 사용할 수 있습니다.$i
put
Raku의 증분(비조건부) 행 번호 매기기는 $
증가/감소할 수 있는 익명 상태 변수 (예: ++$
또는 )를 사용하는 다른 방법을 통해 수행됩니다. $++
따라서 일치하는 패턴의 각 인스턴스에 번호를 매기는 작업은 다음과 같이 수행할 수 있습니다(Raku의 =>
"fat-arrow" 해시 생성자 사용). put
대신 say
탭으로 구분된 출력을 얻으려면 다음을 사용하십시오 .
raku -ne 'state $i=0; ++$i; say (++$ => $i) if /4/;'
입력 예(첫 번째 줄은 비어 있음):
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789
출력 예(위의 최종 코드, 'ordinal-instance' =>
'line-number'. put
대신 say
탭으로 구분된 값을 얻으려면 사용):
1 => 6
2 => 7
3 => 8
4 => 9
5 => 10
6 => 11