방법 1에서는 "문자열 이름"으로 시작하고 "문자열"로 끝나는 줄을 검색합니다.

방법 1에서는 "문자열 이름"으로 시작하고 "문자열"로 끝나는 줄을 검색합니다.

이것은 3개의 문장을 포함하는 strings.xml 파일입니다.

1.string name="schedulelist_nofiles">등록 일정이 없습니다! 제발,

여기에 "Add"(추가) 항목에 누락된 줄이 있습니다. 끈

2. 이 줄은 건너뛰세요!

3.string name="Programme_name">GUIA DE PROGRAMA 문자열

나는 cat 명령 'cat strings.xml | grep "string name="을 사용하지만 다음 줄만 얻습니다.

string name="schedulelist_nofiles">등록 일정이 없습니다! 제발,

string name="Programme_name">GUIA DE PROGRAM 문자열

문장 3처럼 "문자열 이름"으로 시작하고 "문자열"로 끝나는 완전한 줄을 얻고 싶습니다. 이 문제에 대해 어떻게 해야 합니까?

답변1

아래의 sed oneliner를 사용하여 동일한 목적을 달성할 수 있습니다. 테스트해 보았는데 아주 잘 작동했습니다

첫 번째 방법 1

sed -n '/^string name.*string$/p'  filename

방법 1에서는 "문자열 이름"으로 시작하고 "문자열"로 끝나는 줄을 검색합니다.

방법 2

sed -n '/^string name/p' filename | sed -n '/string$/p'

방법 2에서는 먼저 "문자열 이름"으로 시작하는 줄을 검색한 다음 문자열로 끝나는 줄을 검색합니다.

산출

string name="Programme_name">GUIA DE PROGRAMA string

답변2

의 경우 sed, 그들이 string name= ... string전체 줄을 차지하고 모든 string name=s가 다음으로 끝난다고 가정합니다 string.

sed '
  /^string name=/!d
  :1
  / string$/!{
    N
    b1
  }' < strings.xml

답변3

그리고 pcregrep:

pcregrep -Mo '(?s)\bstring name=.*?\bstring\b' < file.xml
  • -M: pcregrep이 정규 표현식을 만족시키기 위해 필요에 따라 입력에서 더 많은 라인을 추출하는 다중 라인 모드
  • -o: GNU에서 정규식과 일치하는 부분을 인쇄합니다. (정규식이 전체 줄과 일치하는 경우 grep생략하거나 .-x
  • (?s): 개행에서도 일치를 유발하는 s플래그를 활성화합니다..
  • .*?: 탐욕스럽지 않은 버전 .*: 가능한 한 적은 수의 문자 수.
  • \b: 단어 경계.

해당 항목이 없으면 다음과 같이 pcregrep동일한 작업을 수행할 수 있습니다 .perl

perl -l -0777 -ne 'print for /\bstring name=.*?\bstring\b/gs' < file.xml

이는 전체 파일을 메모리에 로드하는 것을 의미하지만.

관련 정보