행에서 한 패턴 앞의 모든 항목과 다른 패턴 뒤의 모든 항목을 제거하는 방법은 무엇입니까?

행에서 한 패턴 앞의 모든 항목과 다른 패턴 뒤의 모든 항목을 제거하는 방법은 무엇입니까?

다음 파일에서:

Lorem ipsum dolor sat amet, consectetuer adipiscing elit. Ut eu metus id lectus 전정 척골. 마에케나스 롱스.

consectetuer전후 내용을 모두 삭제하고 싶습니다 elit.

내가 원하는 출력:

consectetuer adipiscing elit.

어떻게 해야 하나요?

답변1

나는 sed를 사용할 것이다

sed 's/^.*\(consectetuer.*elit\).*$/\1/' file

sed s/find/replace/ 디코딩 구문:

  • s/^.*-- 교체는 ^줄의 시작 부분( )에서 시작되고 그 다음에는 다음 항목( .*)이 이어집니다...
  • \(- 명명된 블록 시작
  • consectetuer.*elit\.- 첫 번째 단어와 일치하며, 마지막 단어(이 경우 후행(이스케이프) 점 포함)까지의 모든 ( .*)가 일치됩니다.
  • \)- 명명된 블록 끝
  • 다른 모든 항목( .*)을 줄 끝( $) 과 일치시킵니다.
  • /- 대체 검색 섹션 끝
  • \1\(- \)위와 위 사이의 이름 블록 으로 대체됩니다.
  • /- 교체 끝

답변2

만약에각 라인시작 및 끝 패턴이 포함된 경우 가장 쉬운 방법은 대신 grep.삭제각 줄의 시작과 끝 부분에는 두 패턴 사이의 내용을 간단하게 출력할 수 있습니다. 일치하는 항목만 출력하는 -oGNU의 옵션 :grep

grep -o 'consectetuer.*elit' file

참고: 위에서 언급한 것처럼 이 방법은 파일의 모든 줄을 이 방식으로 구문 분석할 수 있는 경우에만 작동합니다. 그리고 이는 모든 일반적인 사용 사례의 80%를 차지합니다.

답변3

이 질문 제목이 왜 편집되었는지 잘 모르겠습니다."파일에서" 도착하다"줄에서OP는 여러 줄에 걸쳐 있을 가능성을 배제하지 않지만 예제에는 한 줄만 있는 것처럼 보이지만 여기서는 여러 줄 솔루션을 사용하는 것이 도움이 될 수 있습니다.

이는 교차된 선(from1to2이 답변은 파일에 존재하는 경우 작동합니다.):

from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"

예:

[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl

home
 
def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl

home
 
def elit
[xiaobai@xiaobai tmp]$ 

인용하다:쉘 매개변수 확장

답변4

펄 방식. 이는 본질적으로 동일합니다.마이크 V의sed답변:

perl -pe 's/.*(consectetuer.*elit).*./$1/' file

-p"주어진 스크립트를 적용한 후 각 줄을 인쇄합니다 " 를 의미합니다 -e. 는 s/foo/bar/대체 연산자 foo입니다 . bar괄호는 패턴을 캡처하여 대체에 사용할 수 있도록 합니다. 첫 번째로 캡처된 패턴은 이고 $1, 두 번째 패턴 $2은 입니다.

consectetuer따라서 이 명령은 ( ) .*consectetuer이전의 모든 항목 , elit( ) .*elit이전의 모든 항목 , 다음 .*줄 끝 ( ) 이전의 모든 항목을 일치시키고 이를 캡처된 패턴으로 바꿉니다.

관련 정보