首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除模式之间的换行符

删除模式之间的换行符
EN

Unix & Linux用户
提问于 2018-09-17 00:17:45
回答 3查看 331关注 0票数 1
代码语言:javascript
复制
foo
I love
Stack Exchange
bar
Some junk
lines
foo
Welcome to the
world of
Bash
bar
foo
Elon Musk
rocks

是的,在文件末尾没有bar补充foo

所需的输出是

代码语言:javascript
复制
I love Stack Exchange
Welcome to the world of Bash
Elon Musk rocks

因此,删除所有换行符,在^foo^bar之间,或者在没有bar^fooend of file之间。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2018-09-17 07:00:02

使用awk

代码语言:javascript
复制
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
EN

Unix & Linux用户

发布于 2018-09-17 00:43:08

Perl来救我!

代码语言:javascript
复制
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
票数 2
EN

Unix & Linux用户

发布于 2018-09-17 08:26:13

你也可以这样做:

a)这是符合POSIX-sed标准的代码,我们将中间行(!/foo/ and !/bar/)存储在保持区域。

代码语言:javascript
复制
sed -e '
    /foo/,/bar/!d
    /foo/d
    /bar/!{H;$!d;}
    s/.*//;x;s/^\n//;y/\n/ /
' input-file.txt

( b)和Perl (如图所示)

代码语言:javascript
复制
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中的内容并将其清空的行动,为下一个收集周期做准备。
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/469458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档