Bash, модифицирующий текст между отмеченными строками

0

У меня есть файл с более чем 8000 строк. Файл разделен на разделы, каждый раздел помечен текстом, как ## C, ## T, ## N. Я должен изменить некоторые строки в файле. Я использовал команду SED, чтобы отметить строки между этими маркерами. Я новичок в Bash, поэтому я был бы признателен за помощь. Я должен изменить текст между этими маркерами

##C
##A - beginning marker (must be next row after ##C)
text lines, some of them I have to modify
text lines, some of them I have to modify
##B -end marker

Пока у меня есть эта команда, чтобы отметить строки между маркерами

sed -e '/##A/,/##B/{}' file.txt

Строки отформатированы так:

ZDMAD BELCH 0 0 25 26 30 50

Моя цель - изменить некоторые столбцы в определенных строках. Например: если первый столбец ZDMAD, измените третий столбец на 15.

я использовал это решенный вопрос для моего дальнейшего прогресса

pesekvi
источник

Ответы:

0

Так как вы знаете, как сделать sed действуйте только между маркерами, ваша настоящая проблема в том, что вы пока не можете заставить его «изменить некоторые столбцы». Это может быть сложно, потому что sed не знает о столбцах.

Например: если первый столбец ZDMAD, измените третий столбец на 15.

Возможно, этот конкретный пример может быть решен в sed, но в общем случае манипулирования столбцами awk лучше, потому что он разбивает записи на поля и работает на этом уровне абстракции.

Это работает в моем Debian:

awk '
BEGIN {
   marked=0
   markA="##A"
   markZ="##B"
}
$1==markZ {marked=0}
$1=="ZDMAD" && marked==1 {$3=15}
$1==markA {marked=1}
{print $0}
' file.txt

Процедура:

  1. Установите полезные переменные в начале (т.е. только один раз); начать в "немаркированном" состоянии.

Тогда для каждой записи:

  1. Если первое поле является маркером конца, перейдите в состояние «без метки».
  2. Если условие выполнено в «помеченном» состоянии, выполните работу.
  3. Если первое поле является начальным маркером, перейдите в «помеченное» состояние.
  4. Распечатать всю запись.

Обратите внимание, что процедура сначала проверяет маркер конца, выполняет задание и проверяет последний маркер. Дело в том, что он не должен манипулировать линиями маркера. В вашем примере случае условие ( ZDMAD ) не может соответствовать ни одной линии маркера, поэтому другая последовательность не будет проблемой; но в целом вы должны принять это во внимание.

Kamil Maciorowski
источник
Спасибо. Мне пришлось добавить некоторое сравнение регулярных выражений, чтобы убедиться, что строки с ## N и ## A перед текстом, который я изменяю. Но через некоторое время попыток это работает. Я супер новичок в awk или sed. Раньше я создавал только сценарии резервного копирования, в основном, они были частью Crontab. Так что еще раз спасибо за ваш ответ. :)
pesekvi