Удалить текст с помощью сценариев оболочки? - PullRequest
0 голосов
/ 26 ноября 2018

Я хотел бы получить некоторую помощь о том, как я могу использовать cygwin, в которой есть сценарий bash для оболочки:

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

action "action1"
  reset
  type xformbin
  http-method-limited POST
  http-method-limited2 POST
exit

action "action2"
  reset
  admin-state disabled
  type results
  http-method-limited POST
  http-method-limited2 POST
exit

action "action3"
  reset
  admin-state disabled
  type setvar
  http-method-limited POST
  http-method-limited2 POST
exit

Я надеялся, что можно написать сценарий оболочки для удаления блока, в котором admin-состояние = отключено?

Итак, я надеюсь, что смогу перебрать txt-файл и, если admin-state = disabled, удалить все между«действие» и «выход» из этого конкретного блока.

Я ожидаю следующих окончательных результатов из образца текста:

action "action1"
  reset
  type xformbin
  http-method-limited POST
  http-method-limited2 POST
exit

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Таким образом, вы хотите, чтобы весь блок игнорировался, если он «отключен» в середине, но печатался, если этого не происходит.

sed -n '
  /action/,/exit/ {
  /action/ { x; d; }
  H;
  /exit/ { x;
    /disabled/ d;
    p;         d;
  }
}' x

Это ничего не даст, если только в блоке от action до exit.В них -

Если строка имеет action, сохраните ее и удалите пространство шаблона для запуска следующего чтения.

В противном случае добавьте строку к сохраненному пространству удержания.

Если в строке было exit,

  • поменять пространство удержания в пространстве образца
  • , если в собранном образце есть disabled, удалите его, чтобы вызвать чтение следующей записи;
  • , если нет, распечатайте его, затем удалите, чтобы вызвать чтение следующей записи.

Вывод:

$: sed -n '
  /action/,/exit/ {
    /action/ { x; d; }
    H;
    /exit/ { x;
      /disabled/ d;
      p;         d;
    }
  }' infile
action "action2"
reset
admin-state enabled
type xform
http-method GET
http-method-limited POST
http-method-limited2 POST exit

Надеюсь, что поможет.

0 голосов
/ 27 ноября 2018

у вас есть Perl?

local $/="exit";
while (<>) {
    print if not /admin-state disabled/;
}
...