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之间,或者在没有bar的^foo和end of file之间。
发布于 2018-09-17 07:00:02
使用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/的缩写)替换。
发布于 2018-09-17 00:43:08
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逐行读取输入..是range运算符,它返回块中每一行的相对行号。最后一行附加了E0。发布于 2018-09-17 08:26:13
你也可以这样做:
a)这是符合POSIX-sed标准的代码,我们将中间行(!/foo/ and !/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/结尾,这两个行都发生在不同的行上。@A中。存储后,返回读取提供的下一个记录,而不是eof。/bar/或eof,我们才采取打印@A中的内容并将其清空的行动,为下一个收集周期做准备。https://unix.stackexchange.com/questions/469458
复制相似问题