TS1 = "ts.channel0.station1.bit_1_2.o"; # Вкл $ X1-2
TS2 = "ts.channel0.station1.bit_2_5.no"; # Выкл $ X2-2
TS3 = "ts.channel1.station1.bit_1_3.o";# Перекл
TS_OK = "ts.channel0.station1.bit_1_1.o";
Таких строк много, но качественное отличие их друг от друга в том, что у некоторых может не быть "хвоста" после символа $, у некоторых всего хвоста после #.
Какие-то могут заканчиваться сразу после ; а у некоторых после этой точки с запятой могут быть пустые символы (пробелы, табы).
Нужно же на выходе получить:
0 1 1 2 title="X1-2">Вкл<
0 1 2 5 title="X2-2">Выкл<
1 1 1 3 title="">Перекл<
0 1 1 1 title="">1:1<
Т.е. выделить номера каналов, станций, адреса бит - с этим проблем нет.
А вот потом: если в строке есть #, то всё что идёт после неё (за исключением ведущих и завершающих пробелов) - оформить в > <
но дополнительно, если дальше идёт $, то всё что после него (за исключением ведущих и завершающих пробелов) - записать в title.
Это вроде заготовки для XML-тега.
Если же # в строке нет, то в тэг вставить адрес бита.
Вот собственно проблема - в разделении обработки строк где есть решётка (#) и где её нет.
Как ни бьюсь, всё получается: или все строки одинаково обрабатывает или одинаково не обрабатывает.
Хочу сделать примерно так:
Код: Выделить всё
sed "s/.*\".*channel\([[:digit:]]*\)\.station\([[:digit:]]*\)\.bit_\([[:digit:]]*\)_\([[:digit:]]*\)\.n{0,1}o\";[[:space:]]*[^#].*/\"ts.channel\1.station\2.bit_\3_\4.o\"; # \3:\4 $ Не описано/" |
sed "s/.*\".*channel\([[:digit:]]*\)\.station\([[:digit:]]*\)\.bit_\([[:digit:]]*\)_\([[:digit:]]*\)\.n[0,1]o\";[[:space:]]*#[[:space]]*\(.*\)[[:space:]]*$[[:space:]]*\(.*\)[[:space:]]*/\1 \2 \3 \4 title=\"\6\">\5</"
Т.е. первым выражением я в тех строках, где нет комментария (#...) - создаю его сам, а потом получившиеся более однотипные строки отправляю на второй sed, который формирует уже окончательный вывод.
Вот проблема - в первом sed. Никак не получается заставить нормально отработать конструкцию [^#]
Например, она не срабатывает если сразу после точки с запятой строка заканчивается.
И при этом же почему-то под обработку попадают строки, где комментарий - есть.
Два вопроса:
1. Что я не правильно написал в регэкспах в существующей концепции "2 sed"?
2. Может у меня сам принцип подхода к решению этой задачи неуклюжий и есть что-нибудь покрасивше?