두 패턴 사이 (및 제외) 사이의 선 인쇄


13

cURL을 사용하여 양식을 제출하려고합니다. 여기서 일부 내용은 다른 파일에서 가져온 것으로 sed

param1사용하여 다른 파일의 라인 일치 패턴 인 경우 sed아래 명령이 정상적으로 작동합니다.

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

이제 문제를 해결하십시오. 일치하는 패턴 자체를 제외하고 두 개의 일치하는 패턴 사이에 텍스트 만 표시하고 싶습니다.

다음을 file.txt포함 한다고 말하자 .

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

현재, "beetween 2 일치 패턴"많은 sed명령은 제거되지 않습니다 firstmatchsecondmatch.

결과가되기를 원합니다.

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

답변:


15

당신이 그것을 할 수있는 한 가지 방법이 있습니다 :

sed '1,/firstmatch/d;/secondmatch/,$d' 

설명 : 첫 번째 줄에서 firstmatch 와 일치하는 줄까지 삭제하십시오. 라인 매칭에서 secondmatch 마지막 줄에, 삭제합니다.



5

첫 번째 행 1 에서 발생 sed하면 다른 솔루션이 실패합니다 . firstmatch

간단하게 유지하고 단일 범위와 빈 2 정규 표현식을 사용하십시오.
범위 종료를 제외한 해당 범위의 모든 것을 인쇄하십시오 (자동 인쇄 비활성화) 3 :

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

또는 더 짧게는 해당 범위에없는 모든 항목을 삭제하고 범위 끝을 삭제하십시오.

sed '/firstmatch/,/secondmatch/!d;//d' infile


1 : 두 번째 주소가 정규 표현식 인 경우 엔딩 일치 확인은 첫 번째 주소와 일치하는 줄 다음 줄부터 시작하기 때문입니다 .
따라서 /firstmatch/입력의 첫 번째 줄에 대해 평가되지 않으며 sed, 줄 번호와 일치하는 경우 간단히 삭제 1,/RE/하고 두 번째 줄로 이동하여 줄이 일치하는지 확인합니다./firstpattern/

2 : 정규식 빈 (즉,이다 //) sed마지막 경우로 동작을 REGEX 마지막 명령이 사용 (어드레스 또는 대체 명령의 일부로서 하나)인가를 지정 하였다.

3 : ;}구문은 현대적인 sed구현을 위한 것입니다. 오래된 것들은 세미콜론 대신 개행 문자를 사용하거나 별도의 표현을 사용하십시오.sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile


//(내에서 {…}) 하고있는 일 을 설명 할 수 있습니까 ?
G-Man, 'Reinstate

고마워,하지만 내 함정에 빠졌어 나는 그것이 //마지막으로 사용한 정규 표현식 을 의미 한다는 것을 알고 있습니다 . 내가 읽은 모든 것에서 /secondmatch/. 나는 당신의 명령이 작동하는지 테스트를 통해 확인 했으므로 명령이 작동하는 것으로 결론을 내렸지 /firstmatch|secondmatch/만 어떤 문서도 찾을 수 없습니다 ( 당신이 링크 한 POSIX 문서 또는 GNU 이 동작을 설명하는 sed manual ). … (계속)
G-Man, 'Reinstate

(계속)… 재미있는 실험 : (I) In sed: (1) 그렇게 /first/,4하면 다음 //과 같이 작동 /first/합니다. 내가 할 경우 (2) 2,/second/다음 //에 "없는 이전 정규 표현식"오류를 가져옵니다. (I 지정된 동작을 수행하기 위해이 소란스러운 실패를 찾을 수 있습니다.) (3)를 추가 --posix하거나 위의 변경되지 않습니다. (II)에서 다른 프로그램 (4)에서,이 vi/first/,/second/, //마찬가지로 작용한다 /second/(다른 형태가 또한 설명 규칙의 구현 합리적이다). … (계속)
G-Man, 'Reinstate

(계속)… (5)  awk“마지막 RE 사용”에 대한 개념이없는 것 같습니다. //문자 앞뒤에있는 문자 이외의 문자를 나타냅니다. (I 시도하는 당신을 초대합니다 echo -- | awk '{ gsub(//, "cha"); print }'.)
G-남자 '분석 재개 모니카'말한다

따라서 "마지막 명령에 사용 된 마지막 REGEX"를 "마지막 명령에 사용 된 마지막 REGEX"라고 읽습니다 /first|second/. 운이 좋네요 나는 이것이 시스템 전체 정규 표현식 규칙이 아님을 증명하기 위해 다른 프로그램을 언급했다. 그것을 추가 한 사람은 그것을 추가하는 것을 sed귀찮게하지 않았습니다 vim. :-) ⁠
G-Man, 'Reinstate Monica'라고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.