줄 시작 부분의 텍스트를 일치시키고 첫 번째 X 줄과 일치하는 줄을 인쇄하는 방법은 무엇입니까?

줄 시작 부분의 텍스트를 일치시키고 첫 번째 X 줄과 일치하는 줄을 인쇄하는 방법은 무엇입니까?

비슷한 질문을 찾았습니다여기, 하지만 그건 정확히 내가 원하는 것이 아닙니다.

다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.

[...]

age: 10
country: United States
city: New York
name: John

age: 27
country: Canada
city: Toronto
name: Robert

age: 32
country: Mexico
city: Guadalajara
name: Pedro

[...]

"name: Robert"로 시작하는 줄을 일치시키고 일치된 결과와 함께 처음 3줄을 인쇄하여 다음 줄만 가져오고 싶습니다.

age: 27
country: Canada
city: Toronto
name: Robert

터미널에서 어떻게 해야 하나요?

답변1

사용grep

$ grep -B3 '^name: Robert$' input_file
age: 27
country: Canada
city: Toronto
name: Robert

답변2

당신은 이미 가장 좋은 방법을 가지고 있습니다. 단지 를 사용하는 것입니다 grep -B. 그러나 "단락 모드"에서 Perl을 사용할 수도 있습니다. 이 모드는 스위치에 의해 활성화되며 -00"줄"이 이제 두 개의 연속적인 줄 바꿈, 본질적으로 단락으로 정의됨을 의미합니다. 이를 통해 다음을 수행할 수 있습니다.

$ perl -00 -ne 'print if /name: Robert\b/' file
age: 27
country: Canada
city: Toronto
name: Robert

$

awk레코드 구분 기호( )를 비어 있음( )으로 설정하여 RS동일한 작업을 수행 할 수도 있습니다 ''.

$ awk -v RS='' '/name: Robert$/' file
age: 27
country: Canada
city: Toronto
name: Robert
$

awk의 또 다른 장점은 Perl처럼 추가 줄 바꿈을 인쇄하지 않는다는 것입니다.

답변3

데이터 형식은 GNU recutils에서 사용하는 "recfile 형식"과 동일합니다. 이는 다음과 같이 파일을 쿼리할 수 있음을 의미합니다.

$ recsel -e 'name = "Pedro"' file
age: 32
country: Mexico
city: Guadalajara
name: Pedro

20세 이상의 모든 사람의 이름을 얻으려면:

$ recsel -e 'age >= 20' -P name file
Robert

Pedro

등.

를 참고 info recutils하시거나GNU reutils 웹사이트더 많은 정보를 알고 싶습니다.

답변4

라인 편집기를 사용하여 ed먼저 대상 라인(g//)을 선택한 다음 그 주위에 범위(-3, .)를 만들고 해당 범위(p)에서 명령을 실행합니다.

ed -s inp <<\eof
g/^name: Robert$/-3,.p
eof

## Gnu sed in extended regex mode
## collect 4 lines in pattern space then print the whole pattern space on match else clip first line and append the next

sed -E ':1;$!{N;/(.*\n){3}/!b1;/\nname: Robert$/b};D' file

# using the -p option to autoprint current record 

perl -00 -pe '($_)=/((?:.*\n){3}name: Robert\n)/' file

산출:

age: 27
country: Canada
city: Toronto
name: Robert

관련 정보