sed를 사용하여 범위 내에서 역순으로 패턴 검색을 수행하고 일치하는 각 줄 번호를 가져옵니다.

sed를 사용하여 범위 내에서 역순으로 패턴 검색을 수행하고 일치하는 각 줄 번호를 가져옵니다.

특정 범위 내의 패턴을 역순으로 검색하고 싶습니다. 예를 들어, 내가 제공한 범위에 내가 제공한 범위가 2,8이라고 나와 있으면 검색을 역순으로 수행해야 합니다. 즉, 검색은 8번째 줄부터 2번째 줄까지 수행되어야 하며 어떤 줄이라도 패턴과 일치하면 줄 번호가 인쇄됩니다.

다음과 같은 입력 파일이 있다고 가정해 보겠습니다.

Hello world
Hello Universe
Hello Universe
Hello Maths
Hello Physics
Hello Earth
Hello Universe
Hello Tennis
Hello God
Hello Teacher

따라서 파일에는 10줄이 있습니다. 이제 8행과 2행 사이의 입력을 검색하고 싶습니다 Hello Universe. 따라서 출력은 우리가 일치한 줄 번호여야 합니다.Hello Universe

따라서 위의 예에 따르면 출력은 다음과 같아야 합니다.

7
3
2

이 명령을 시도했지만 sed -n '!G;h;2,8{\|Hello Universe|=}' a.txt실제로는 오름차순으로 검색을 수행합니다.

인터넷에서 검색한 결과 sed '1!G;h;$!d' a.txt이렇게 하면 실제로 파일이 역순으로 인쇄된다는 사실을 발견했습니다. 각 패턴 일치에서 줄 번호를 역순으로 인쇄하도록 이 명령을 수정하고 싶었습니다.

그렇다면 명령을 어떻게 수정할 수 있습니까? 도와주세요

답변1

텍스트 파일의 200~250행에서만 일치하는 항목을 찾고 싶지만~에서tac250과 200 이전에는 파일을 역순으로 인쇄하는 것이 간단한 해결책이었습니다 . 그런 다음 를 사용하여 grep -n패턴을 검색하고 줄 번호와 작은 Perl 스크립트를 인쇄하여 줄 번호를 원본 파일의 올바른 번호로 변경할 수 있습니다. 이 같은:

sed -n '200,250p' file | tac | grep -n "$pattern" | perl -pe 's/(^\d+)/251-$1/e'

테스트 파일을 생성한다면:

printf 'Line number %d\n' {1..400} > file

그런 다음 21패턴으로 210~219 및 221행을 얻어야 합니다.

$ sed -n '200,250p' file | tac | grep -n 21 | perl -pe 's/(^\d+)/251-$1/e'
221:Line number 221
219:Line number 219
218:Line number 218
217:Line number 217
216:Line number 216
215:Line number 215
214:Line number 214
213:Line number 213
212:Line number 212
211:Line number 211
210:Line number 210

관련 정보