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 / 问题 / 493135
Accepted
Wildcard
Wildcard
Asked: 2019-01-08 19:00:16 +0800 CST2019-01-08 19:00:16 +0800 CST 2019-01-08 19:00:16 +0800 CST

搜索三个连续的换行符?

  • 772

我知道可以使用压缩多个空行cat -s(并且可以使用压缩所有空行tr -s '\n'),但我很好奇如何在输入流中搜索此条件。

我以为stream-of-input | grep -qz $'\n\n\n'这样可以,但事实并非如此。

有没有办法用简单的工具来做这个搜索?

换句话说,如果三个连续的字节是换行符,则读取输入并以零状态退出,或者如果在没有找到三个连续的换行符的情况下达到 EOF,则以非零状态退出。

grep search
  • 2 2 个回答
  • 570 Views

2 个回答

  • Voted
  1. Best Answer
    Michael Homer
    2019-01-08T19:28:02+08:002019-01-08T19:28:02+08:00

    您可以使用tr将流转换为可以正常使用 grep 的流:

    stream | tr 'x\n' '\0x' | grep -qz xxx
    

    这会将所有x字节转换为空字节,并将所有换行字节转换为xs,这可以像往常一样被 grep 出。也就是说,它沿着 linefeed -> x -> null 路径移动了一步,因此三个换行符的序列现在将是三个xs 的序列,并且不会出现其他x字节(它们将成为 null 终止行的grep) .


    这适用于 POSIXtr,但grep -z它是一个扩展。您可能不需要它 - 这里不需要分离行为 - 大多数greps 将处理二进制数据,但POSIXgrep只需要处理文本文件,因此您将依赖于一种或另一种扩展。

    如果你的真实数据是一个文本文件,或者只是不依赖于二进制安全的行为,你可能只能依靠

    stream | tr 'x\n' '\nx' | grep -q xxx
    

    - 也就是说,只是交换两个字节。这几乎与 POSIX 兼容,但实际上几乎可以在任何地方工作(问题是最后一行不会正确终止,因此它不是文本文件,因此grep不严格要求接受它)。

    在任何一种情况下,一个可能的问题是没有现有x字节的文件将被视为一个很长的行,这可能超出您的grep实现将处理的限制。选择另一个预期的公共字节可能会解决这个问题。

    我很惊讶您的原始grep -qz $'\n\n\n'命令不起作用,但它对我来说有一个误报问题- 它似乎表现得像grep -qz ''并且总是匹配。我不确定为什么会这样。

    • 3
  2. thrig
    2019-01-08T19:27:55+08:002019-01-08T19:27:55+08:00

    lex(或flex)可以处理这个问题,例如以下内容保存到tresn.l带有额外规则的文件中,主要是为了防止默认输出到标准输出(你可能想要那个?)

    %%
    \n\n\n  { exit(0); }
    <<EOF>> { exit(1); }
    \n\n    { ; }
    \n      { ; }
    .       { ; }
    %%
    

    用隐式make规则编译并加入libfl*

    $ CFLAGS=-lfl make tresn
    lex  -o lex.tresn.c tresn.l
    cc -lfl   -o tresn lex.tresn.c  -ll
    rm -f lex.tresn.c
    $ printf "\n\n" | ./tresn ; echo $?
    1
    $ printf "\n\n\n" | ./tresn ; echo $?
    0
    

    在某些系统上,您可能需要添加或-L/opt/local/lib诸如隐藏在供应商编译空间之外的某些端口或软件包系统下。CFLAGSLDFLAGSlibfl*

    • 2

相关问题

  • 来自 `service | 的意外结果 grep`

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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