![줄 시작 부분의 텍스트를 일치시키고 첫 번째 X 줄과 일치하는 줄을 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/209114/%EC%A4%84%20%EC%8B%9C%EC%9E%91%20%EB%B6%80%EB%B6%84%EC%9D%98%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%BC%EC%B9%98%EC%8B%9C%ED%82%A4%EA%B3%A0%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20X%20%EC%A4%84%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
비슷한 질문을 찾았습니다여기, 하지만 그건 정확히 내가 원하는 것이 아닙니다.
다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.
[...]
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