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
}'