【问题标题】:Reformat ini string重新格式化 ini 字符串
【发布时间】:2019-06-19 08:34:51
【问题描述】:

我有一个包含一行的文本文件。

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

【问题讨论】:

    标签: linux bash ini


    【解决方案1】:

    此命令适用于更一般的情况(例如,如果没有 Param1Param2 但有实际标识符)并更精确地匹配您的预期输出:

    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 个单独的表达式,由 ; 分隔:

    1. s/ \(Login successfully\|Program Terminated...\)//g - 删除不需要的 Login successfullyProgram Terminated...,并在它们之前添加一个空格
    2. s/\[ /[/g - 删除[ 之后的空格
    3. s/\(\[\|[Ss]tate\)/\n\1/g - 在 Statestate 之前添加一个换行符
    4. 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
    

    【讨论】:

      【解决方案2】:

      [&lt;space&gt; 替换为[ 并在[ParamState 字符串之前添加换行符:

      $ sed 's/\[ /[/g; s/\(\[\|Param\|State\)/\n\1/g' <<<'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...'
      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...
      

      【讨论】:

      • 如果我的参数喜欢这种模式,我该怎么做。 2019-06-19 09:00 登录成功 [第 1 节] 用户名:xxxx 主机:xxx URL:xxx 状态:OPEN [第 2 节] 用户名:xxxx 主机:xxx URL:xxx 状态:OPEN 程序终止...
      • @Mr.K 查看我的答案,它应该适用于这种模式。
      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2015-04-01
      • 2012-08-16
      • 1970-01-01
      相关资源
      最近更新 更多