AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 469458
Accepted
GypsyCosmonaut
GypsyCosmonaut
Asked: 2018-09-17 16:17:45 +0800 CST2018-09-17 16:17:45 +0800 CST 2018-09-17 16:17:45 +0800 CST

删除模式之间的换行符

  • 772
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

awk text-processing
  • 3 3 个回答
  • 297 Views

3 个回答

  • Voted
  1. choroba
    2018-09-17T16:43:08+08:002018-09-17T16:43:08+08:00

    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附加到它。
    • 2
  2. Best Answer
    Stéphane Chazelas
    2018-09-17T23:00:02+08:002018-09-17T23:00:02+08:00

    与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第一个单词为 with 的行,请替换$0 == "foo"为$1 == "foo"; 匹配以 开头的行foo,替换为/^foo/( 的缩写$0 ~ /^foo/)。

    • 2
  3. Rakesh Sharma
    2018-09-18T00:26:13+08:002018-09-18T00:26:13+08:00

    你也可以这样做:

    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/or eof,我们采取打印内容@A并将其清空的操作,为下一个收集周期做准备。
    • 1

相关问题

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve