특정 라인 간 패턴 검색 및 라인 번호 인쇄

특정 라인 간 패턴 검색 및 라인 번호 인쇄

20줄의 파일이 있습니다. 10번째 줄과 15번째 줄 사이의 문자열을 검색하여 원본 파일의 줄 번호와 함께 해당 문자열을 인쇄하고 싶습니다.

나는 열심히 노력했다sed -n 10,15p file | grep -n "pattern"

위 명령의 문제점은 라인 번호 10의 출력이 sed라인 번호 1이 된다는 것입니다 grep.

따라서 원본 파일의 줄 번호는 인쇄되지 않습니다.

답변1

누군가와 함께 일할 때 sed나는 일반적으로 가능한 결과의 범위를 지속적으로 좁히는 것이 가장 쉽다는 것을 알았습니다. 이것이 제가 때때로 !부정 연산자에 의존하는 이유입니다. 흥미로운 입력을 선택적으로 선택하는 것보다 흥미롭지 않은 입력을 제거하는 것이 더 쉬운 경우가 많습니다. 적어도 이 문제에 대한 제 생각은 그렇습니다.

나는 이 접근 방식이 sed스크립트 끝 부분에 패턴 공간을 자동으로 인쇄하는 기본 동작과 더 일치한다고 생각합니다. 이와 같은 간단한 작업의 경우 강력한 스크립트(구현된 일부 구문 확장에 의존하지 않고 작동하는 스크립트)를 더 쉽게 생성할 수 있습니다.(일반적으로 sed {functions}).

그렇기 때문에 다음을 수행하는 것이 좋습니다.

sed '10,15!d;/pattern/!d;=' <input

...먼저 10행과 15행 범위 내에 없는 행을 잘라낸 다음 나머지 행에서 일치하지 않는 행을 잘라냅니다 pattern. sed일치하는 줄과 같은 줄에 줄 번호를 인쇄하고 싶다면 paste그 경우에 고려해 볼 수 있습니다. 아마도...

sed '10,15!d;/pattern/!d;=' <input |
paste -sd:\\n -

...이것은 입력 줄줄을 \n하나의 :문자 또는 다른 \n줄줄로 교대로 대체합니다.

예를 들어:

seq 150 |
sed '10,50!d;/5/!d;=' |
paste -sd:\\n -

...인쇄...

15:15
25:25
35:35
45:45
50:50

답변2

해결책 은 다음과 같습니다 awk.

awk '10<=NR && NR<=15 && /pattern/ {print NR,$0}' file

우리가 사용해야한다면오직 sed, 그런 다음 다음을 고려하십시오.

sed -n '10,15 {/pattern/ {=;p}}' file | sed 'N;s/\n/ /'

sed의 =명령은 별도의 줄에만 줄 번호를 인쇄합니다. 위의 두 번째 인스턴스는 sed행 번호가 해당 행 앞에 나타나도록 두 행을 모두 결합합니다.

답변3

사용nl:

nl file | sed -n '10,15{/pattern/p
}'

관련 정보