正则表达式 – 合并线条之间,不包括重复模式与sed

我有一个包含时间戳的行数的文件,中间有几行.例如,

TIMESTAMP MESSAGE
TRAIL 1
TRAIL 2
TIMESTAMP MESSAGE2
TRAIL 21
TRAIL 22 ...

我想将所有跟踪消息添加到一行中,或者更好的是将两个时间戳之间的所有行添加到一行中,以便我的输出看起来像

TIMESTAMP MESSAGE TRAIL 1 TRAIL 2
TIMESTAMP MESSAGE2 TRAIL 21 TRAIL 22 ...

在这里经历了几个类似的问题,但在我的案例中没有任何问题.我试过用

sed -i '/pattern_for_timestamp/{n;:l N;/pattern_for_timestamp/b ; s/\n// ; bl}'

但它只会改变模式的每个替代事件.跟踪消息中不需要任何模式.在这种情况下,我更喜欢使用sed或awk.

解决方法

我会去收集空间中的线条直到完成,然后修改和打印,例如:

parse.sed

/^TIMESTAMP/ b prn            # Run the prn subroutine
H                             # Anything else is appended to hold-space
$b prn                       # Also run prn at end-of-input
b                             # Process next line

:prn
x                             # Swap pattern-space and hold-space
s/\n/ /g                      # Replace \n with space
1!p                           # Print the result if not on the first line

像这样运行:

sed -nf parse.sed infile

或者作为一个单行:

sed -n '/^TIMESTAMP/bp;H;$bp;b;:p;x;s/\n/ /g;1!p' infile

输出

TIMESTAMP MESSAGE TRAIL 1 TRAIL 2
TIMESTAMP MESSAGE2 TRAIL 21 TRAIL 22 ...

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...