Переформатировать строку ini - PullRequest
2 голосов
/ 19 июня 2019

У меня есть текстовый файл, содержащий одну строку.

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

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Эта команда работает в более общем случае (например, если у вас нет 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'

Как этоworks:

Команда имеет 4 отдельных выражения, разделенных ;:

  1. s/ \(Login successfully\|Program Terminated...\)//g - удаляет ненужные Login successfully и Program Terminated... с пробелом перед ними
  2. s/\[ /[/g - удаляет пробел после [
  3. s/\(\[\|[Ss]tate\)/\n\1/g - добавляет новую строку перед State или state
  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
0 голосов
/ 19 июня 2019

Замените [<space> на [ и добавьте новую строку перед строками [, Param и State:

$ 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...
...