Заполните пропущенные поля значениями из строки ниже

Некоторые цвета можно настраивать. Похоже, вы говорите о коде, реализованном здесь:

attrs[3] = tag_key_selected_attr;
attrs[2] = tag_key_attr;
attrs[1] = tag_selected_attr;
attrs[0] = tag_attr;

и ("ключ" - интересующая деталь )несколько примеров настройки цветов в каталоге samples, например, этот раздел:

# Tag key color
tag_key_color = button_key_inactive_color

# Selected tag key color
tag_key_selected_color = (RED,BLUE,ON)

То есть, если бы вы сделали цвета различных тегов -одинаковыми, выделение исчезло бы.

0
04.12.2020, 11:39
4 ответа

Это задача, в которой мы можем использоватьtacдля разбора файла в обратном порядке:

tac file | awk -F';' 'NF > 1 {p = substr($0,index($0,FS))} {print $1 p}' | tac

Итак, мы не сохраняем никаких строк, а печатаем после прочтения каждой из них.

Когда NF > 1мы сохраняем подстроку от первого FSдо конца строки для использования в будущем.

3
18.03.2021, 22:45

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

sed -E '
    /;/!{ :a N;/;/!{ s/\n/-/;ta; }; };
    /;/ { s/\n/-/; };
    :c s/([^-]*)-([^;]*)(;.*)$/\1\3\n\2\3/; tc' infile
1
18.03.2021, 22:45

Использование GNU sedс включенным расширенным режимом регулярных выражений-E

  • Сохранение записей и ожидание записи с точкой с запятой, когда начинается действие.
  • Когда мы сталкиваемся со строкой с запятой, начинается процесс слияния, при котором последняя часть пространства шаблонов (= строка с запятой )добавляется к первой части пространства шаблонов, а первая часть печатается и удаляется. Это продолжается до тех пор, пока мы не исчерпаем пространство шаблона.

$ sed -Ee '/\n/ba
    H;/;/!d;z;x;D;:a
    s/\n(.*\n)?[^;]+(;.*)/\2&/
    P;/\n.*\n/D;s/.*\n//
' file

$ perl -lne '$, = ";";
    push(@A,$_),next if !/;/;
    my $a = s/.*?;//r;
    print $_, $a for splice @A;
    print;
' file

1
18.03.2021, 22:45

Другоеawk-решение на основе двойного -прохода (требует GNU awkили nawkдля функции gensub()):

awk -F';' 'FNR==NR{if (NF>1) data[++i]=gensub(/^[^;]+/,"","1");next}
           {if (NF==1) $0=$0 data[j+1]; else j++;} 1' input.csv input.csv

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

2
18.03.2021, 22:45

Теги

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