이것은 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
이는 전체 파일을 메모리에 로드하는 것을 의미하지만.