패턴 사이의 개행 제거

패턴 사이의 개행 제거
foo
I love
Stack Exchange
bar
Some junk
lines
foo
Welcome to the
world of
Bash
bar
foo
Elon Musk
rocks

bar예, 파일 끝에는 보완 항목이 없습니다.foo

원하는 출력은

I love Stack Exchange
Welcome to the world of Bash
Elon Musk rocks

^foo따라서 와 사이 ^bar^foo사이 end of file에 있는 모든 개행 문자를 제거하세요.bar

답변1

그리고 awk:

awk '
  $0 == "foo" {if (sep) print ""; sep = ""; inside = 1; next}
  $0 == "bar" {inside = 0; next}
  inside {printf "%s", sep $0; sep = " "}
  END {if (sep) print ""}'

foo첫 번째 단어가 인 행을 일치시키려면 ;로 시작하는 행을 일치시키려면 (의 약어 ) $0 == "foo"를 바꾸십시오 .$1 == "foo"foo/^foo/$0 ~ /^foo/

답변2

Perl이 구출하러 옵니다!

perl -ne '
    if ($e = /^foo$/ .. /^bar$/) {
        if ($e =~ /E/) { print "\n" }
        else {
            chomp;
            print " " if $e > 2;
            print     if $e > 1;
        }
}' -- input.txt
  • -n입력을 한 줄씩 읽습니다.
  • ..블록에 있는 각 줄의 상대 줄 번호를 반환하는 범위 연산자입니다. 마지막 줄 E0이 추가되었습니다.

답변3

다음과 같이 할 수도 있습니다.

a) 이것은 POSIX-sed예약된 영역에 중간 범위 라인(!/foo/ 및 !/bar/)을 저장하는 호환 코드입니다.

sed -e '
    /foo/,/bar/!d
    /foo/d
    /bar/!{H;$!d;}
    s/.*//;x;s/^\n//;y/\n/ /
' input-file.txt

b) 그리고 Perl그림에 표시된 것처럼

perl -lne '
   next unless /foo/ ... /bar/;
   push(@A, $_),next if !/foo/ && !/bar/ && !eof;
   push(@A, $_)      if !/foo/ && !/bar/ &&  eof;
   print join " ", splice @A if /bar/ || !/foo/ && eof;
' input-file.txt

설명하다:

  • 관심 없는 행이나 범위를 벗어난 행을 건너뜁니다. 범위는 포함하는 줄로 시작 /foo/하고 로 끝나는 것으로 정의되며 /bar/, 둘 다 서로 다른 줄에 나타납니다.
  • 범위 내에 있으면 현재 있는 라인에 따라 개별 작업을 수행합니다.
  • /foo/, /bar/, eof 이외의 라인의 경우: 해당 라인을 배열에 저장합니다 @A. 저장이 완료된 후 다음 레코드(eof 아님)를 읽기 위해 돌아갑니다.
  • 범위의 끝, 즉 /bar/또는 에 대해서만 다음 수집 주기를 준비하기 위해 콘텐츠를 인쇄하고 비우는 작업을 eof수행합니다 .@A

관련 정보