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