linux - 重新格式化 ini 字符串
问题描述
我有一个包含一行的文本文件。
2019-06-19 09:00 Login successfully [ Section 1] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 2] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 3] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 4] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 5] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 6] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN Program Terminated...
我试过 awk 但它只打印最后一部分:
awk '{for(i=1;i<=NF;i++) {if ($i == "Section") beginning=i; if($i== "OPEN") ending=i }; for (j=beginning;j<=ending;j++) printf $j" ";printf "\n" }'
Section 6] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN
如何重新格式化为这种模式?
2019-06-19 09:00
[Session 1]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State : OPEN
...
...
[Session 6]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State : OPEN
解决方案
此命令适用于更一般的情况(例如,如果没有Param1
,Param2
但实际标识符)并更精确地匹配您的预期输出:
sed 's/ \(Login successfully\|Program Terminated...\)//g; s/\[ /[/g; s/\(\[\|[Ss]tate\)/\n\1/g; s/\([A-Z][A-Za-z0-9]* :\)/\n\1/g'
这个怎么运作:
该命令有 4 个单独的表达式,由 分隔;
:
s/ \(Login successfully\|Program Terminated...\)//g
- 删除不需要的Login successfully
并Program Terminated...
在它们前面留一个空格s/\[ /[/g
- 删除后的空间[
s/\(\[\|[Ss]tate\)/\n\1/g
State
- 在或之前添加换行符state
s/\([A-Z][A-Za-z0-9]* :\)/\n\1/g
- 在“Params”之前添加一个换行符,其名称由大写字母 ([A-Z]
) 和任何 ASCII 字母或数字 ([A-Za-z0-9]
)组成
例子:
$ STRING="2019-06-19 09:00 Login successfully [ Section 1] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 2] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 3] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 4] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 5] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN [ Section 6] Param1 : xxxx Param2 : xxxx Param3 : xxxx Param4 : xxxx State: OPEN Program Terminated..."
$ echo $STRING | sed 's/ \(Login successfully\|Program Terminated...\)//g; s/\[ /[/g; s/\(\[\|[Ss]tate\)/\n\1/g; s/\([A-Z][A-Za-z0-9]* :\)/\n\1/g'
2019-06-19 09:00
[Section 1]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
[Section 2]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
[Section 3]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
[Section 4]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
[Section 5]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
[Section 6]
Param1 : xxxx
Param2 : xxxx
Param3 : xxxx
Param4 : xxxx
State: OPEN
推荐阅读
- c - 如何同时正确使用管道和信号?
- java - 为什么我无法连接到作为 Docker 容器运行的 HBase?
- arrays - 有没有办法比较一个数字序列与 Ruby 中另一个数字序列的相似程度?
- reactjs - 导入 React Native 组件
- swift - 如何测试 Swift 包中的类?
- sql - SQL 最大值(数量*产品价格)
- swift - 保存已编辑的核心数据实体未保存
- c# - 如何在本地查看 .cshtml 设计
- swift - 具有复杂类型的 Swift CustomStringConvertible
- reactjs - 如何在本机反应中解决此错误 RNGestureHandlerButton?