解析行时将输入记录分隔符更改为 \n 或 \r

2024-04-11

我有一个 perl 脚本,它读取从另一个进程传输的输出(逐行),进行一些处理并输出其结果:

#!/bin/bash 
set -e
set -o pipefail

RUN.SH ${@} 2>&1 | perl -M"Term::ANSIColor" -wnl -e '
m/ERROR/i and print "\e[1;91m", "$_", "\e[0m" 
or print;'

而且效果很好,除非过程的输出RUN.SH不以新行结束(\n)并以\r反而!在这种情况下,这个 Perl 解析器不会打印任何内容,直到下一个\n。我需要更改它,以便它可以同时使用\n and \r作为输入记录分隔符。

有什么想法吗?


读取文件的方法有四种:

  • 一次一个字符:getc
  • 一次一行:readline with $/ = $terminator;
  • 一次一个块:read and readline with $/ = \$length;
  • 当数据到达时:sysread

getc会起作用,但我会使用更有效的sysread.

perl -we'
   sub make_iter {
      my ($fh) = @_;

      my $buf = "";
      my $eof = 0;

      return sub {
         return if $eof;

         while (1) {
            return $1 if $buf =~ s/^([^\r\n]*[\r\n])//;

            my $rv = sysread(STDIN, $buf, 64*1024, length($buf));
            if (!$rv) {
               $eof = 1;
               die $! if !defined($rv);
               return $buf if length($buf);
               return;
            }
         }
      };
   }

   binmode(STDIN);
   binmode(STDOUT);
   $| = 1;

   my $iter = make_iter(\*STDIN);
   while (my ($line) = $iter->()) {
      $line = "\e[1;91m" . $line . "\e[0m" if $line =~ /ERROR/i;
      print($line);
   }
'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析行时将输入记录分隔符更改为 \n 或 \r 的相关文章

随机推荐

  • android 中 EditText 内的可点击按钮(或任何视图)

    我想在我的 EditText 中有一个按钮或可单击的视图 以便我可以在单击它时执行一些操作 我能够在我的 EditText 中放置一个可绘制对象 这要归功于马科斯贝里戈 https stackoverflow com users 18191
  • 如何从脚本中获取当前的 PHP 可执行文件?

    我想从 PHP CLI 中运行 PHP CLI 程序 在某些将运行此程序的计算机上 同时安装了 PHP 4 和 PHP 5 如果我运行外部程序 php5 outer php 我希望内部脚本使用相同的 PHP 版本运行 在 Perl 中 我会
  • 循环结束时的无限动画关键帧和 z 索引问题

    我有一些动画 最终希望能组成一个漂亮的纯 CSS 动画 基本上我将数字分成两部分 并在 X 轴上旋转 180 为这两部分设置动画 然而 由于关键帧的无限循环 我在 z 索引方面遇到了问题 在循环结束时 错误的数字位于顶部 因此短暂地显示了错
  • ASP.NET Core - 在运行时更改 JWT SecurityKey

    具有与此类似的配置 services AddAuthentication JwtBearerDefaults AuthenticationScheme AddJwtBearer x gt x TokenValidationParameter
  • 如何使用 homebrew 在 macOS 中安装早期版本的 Python 3?

    如何使用brew 在 macOS 中安装以前版本的Python 3 通过命令brew install python我获得了最新版本的 Python 3 当前为 v3 7 0 但我想要最新版本的 Python 3 6 当前为 3 6 5 我读
  • 如何将边框半径应用于具有水平滚动的分隔表格行?

    我有一个包含大量数据的表 因此必须水平滚动 我设计了将每一行分隔为每张单独卡片的表格 但我无法正确获得表格行左右部分的边框半径 如果我滚动到右端 那么我可以看到右侧的半径和左侧的半径相同 当您位于中间时 您看不到任何边界半径 PS 当存在水
  • 如何间隔重叠注释

    我想用一些文本注释图表中的条形 但如果条形靠得很近并且高度相当 则注释高于 ea 其他 因此难以阅读 注释的坐标取自条形位置和高度 如果发生碰撞 有没有办法移动其中一个 Edit 这些条非常细 有时非常接近 所以仅垂直对齐并不能解决问题 A
  • 类型错误:未定义不是构造函数

    我对 Angular 还很陌生 我仍在尝试解决其中的大部分问题 我正在使用从 Yeoman Generator 生成的 Angular 1 5 8 编写一些测试 具体来说 我试图弄清楚如何操纵 httpBackend 结果 我不确定这是否重
  • matplotlib、pyplot.annotate 的自定义箭头样式

    我正在使用 matplotlib pyplot annotate 在我的绘图上绘制箭头 如下所示 import matplotlib pyplot as plt plt annotate x ybottom x ytop arrowprop
  • 组合:使用特征来避免转发功能?

    假设我们有两个班级 A and B 当使用组合来建模时 has a or 根据 实施 关系 例如B has a A 相对于继承的缺点之一是B不包含公共功能A它需要 为了获得访问A的公共功能 需要提供转发功能 与继承相反 其中B将继承所有A的
  • WTForm“OR”条件验证器? (电子邮件或电话均可)

    class ContactForm Form name StringField Name validators DataRequired Length max 255 email StringField Email validators O
  • C 避免对齐问题

    请解释一下 下面的示例到底有什么问题 特别是 这可能导致从不是四的倍数的地址加载 32 位无符号长整型 的部分 编译器通常会自然地防止对齐问题 对齐所有数据类型 事实上 对齐问题通常不是 内核开发人员主要关心的问题 gcc 人员必须担心 关
  • 解码 Base64urlUInt 编码值

    我通常想做的是验证id token从 OpenID Connect 提供商 例如 Google 获得的值 令牌使用 RSA 算法进行签名 公钥从发现 https openid net specs openid connect discove
  • 如何在 SwiftUI 的 ScrollView 中创建多行文本?

    Since List看起来目前无法配置删除行分隔符 我正在使用ScrollView with a VStack在其中创建文本元素的垂直布局 下面的例子 ScrollView VStack Text Lorem ipsum dolor sit
  • 提高 C++ 正则表达式替换性能

    我是一名初级 C 程序员 正在处理一个小型 C 项目 我必须处理许多相对较大的 XML 文件并从中删除 XML 标签 我已经使用 C 0x 正则表达式库成功地做到了这一点 但是 我遇到了一些性能问题 在我的 PC 上 仅读取文件并对其内容执
  • 不可变会占用内存吗?

    假设我们有一个内存密集型类 例如Image 使用可链接的方法 例如Resize and ConvertTo 如果这个类是不可变的 当我开始做类似的事情时 是否会占用大量内存i Resize 500 800 Rotate 90 Convert
  • 启动时 Tmux [退出] [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 将文件输入作为 img 插入 DOM 中

    两部分问题 基本上 在一天结束时 我想要一个file
  • OSX 上 MongoDB 的 Sane 默认设置?

    我安装了 MongoDB 并进行了如下设置 数据库路径 data db 系统范围的配置文件 usr local mongodb mongod conf launchctl plist Library LaunchDaemons org mo
  • 解析行时将输入记录分隔符更改为 \n 或 \r

    我有一个 perl 脚本 它读取从另一个进程传输的输出 逐行 进行一些处理并输出其结果 bin bash set e set o pipefail RUN SH 2 gt 1 perl M Term ANSIColor wnl e m ER