Пошаговая замена строк между двумя шаблонами регулярных выражений в файле

Вы можете использоватьperl:

echo $(( $(printf "%(%s)T") - 5 * 60 )) | perl -lne 'print scalar localtime $_'

Или в чистом перле:

perl -le 'print scalar localtime(time()-5*60)'

Для форматирования используйтеstrftime():

perl -MPOSIX=strftime -le 'print strftime("%d %h %Y %H:%M:%S", localtime(time()-5*60))'
5
04.06.2021, 20:22
4 ответа

Использование любого awk в любой оболочке на каждом компьютере Unix:

$ awk '$1=="field:"{s=ORS $0; next} {print $0 s; s=""}' file
- metric: 'example.metric.1'
  attributes:
    - attr: 'example1'
      field: 'example 1'
    - attr: 'example2'
      field: 'example 2'
    - attr: 'example3'
      field: 'example 3'
    - attr: 'example4'
      field: 'example 4'
- metric: 'example.metric.2'
  attributes:
    - attr: 'example5'
      field: 'example 5'
    - attr: 'example6'
      field: 'example 6'
    - attr: 'example7'
      field: 'example 7'
- metric: 'example.metric.3'

Если у вас может не быть пробела после field:в некоторых строках или у вас просто есть сильное желание использовать регулярное выражение по какой-либо причине, измените $1=="field:"на $1~/^field:/или /^[[:space:]]*field:/, в зависимости от того, что вы предпочитаете.

6
28.07.2021, 11:26

Использованиеawk:

awk '{if ($1 == "field:") {a=$0;x=0} 
else if (/- attr:/) {$0 = $0 ORS a; x=1} else {x=1}}x' input

В этой команде, если field:найдено, текущая входная запись($0)сохраняется в переменной a, а x устанавливается равным нулю. И если attr:найдено, то $0является изменением d к старому $0, за которым следуетORS(новая строка ), за которой следует переменная a.

2
28.07.2021, 11:26

Сsed:

sed -n '/^ *field: /{h;n;G};p' data

Если мы находим ключевое слово field, то:

  • сохранить текущую строку в папкеhold space(h)
  • получить следующую строку из файла вpattern space(n)
  • поменяйте местами pattern spaceнаhold space(G)(Equals для замены строки)

печатать каждую строку, с которой вы сталкиваетесь:p

3
28.07.2021, 11:26

Мы можем использовать конструкции POSIX sed, чтобы инвертировать указанные строки.

sed '/attr:/!x;$G' file
1
28.07.2021, 11:26

Теги

Похожие вопросы