Udev позволяет реагировать на аппаратные события, в этом случае ACTION
может быть add
, remove
, change
.
У вас есть ACTION=="change"
, который срабатывает при вставке или извлечении DVD.
Попробуйте следующее правило:
KERNEL=="sr1", ACTION=="add",ENV{ID_CDROM_MEDIA_DVD}="1", ENV{ID_CDROM_MEDIA_STATE}!="blank", RUN+="/mnt/DVD/MakeMKV/trigger.sh"
Вы толком не объяснили, как мы можем узнать, какие запятые оставить, а какие заменить. Основываясь на единственной строке примера, которую вы нам дали, может быть достаточно просто заменить все ,
, которые не идут после пробела, на|
:
$ sed -E 's/,(\S)/\|\1/g' file
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
Или, если вы действительно не хотите менять заголовок:
$ sed -E '2,${s/,(\S)/\|\1/g}' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
В качестве альтернативы, если мы не можем полагаться на пробел и вместо этого должны заменить все запятые, кроме 5-й в строках, на что-то вроде этого :«если в этой строке более 7 полей, то рассмотрим 5-й ,
в строке строка как часть 4-го поля, а не как разделитель». Если это так, это должно сработать для вас:
$ $ perl -F, -lane 'if($#F>6){$F[4].=",$F[5]"; splice(@F,5,1)} print join("|",@F)' file
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
Или, опять же, если вы действительно не хотите менять заголовок, используйте:
$ perl -F, -lane 'if($#F>6){$F[4].=",$F[5]"; splice(@F,5,1)} $.==1 ? print : print join("|",@F)' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
$ perl -F, -lne 'if ($#F == 7) {$F[4].= ",$F[5]"; splice @F,5,1};
print join("|",@F);' input.csv
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
Этот лайнер Perl One -проверяет, сколько полей, разделенных запятыми -, находится в каждой строке ввода. Если есть 8 полей, он добавляет запятую и содержимое поля 5 к полю 4, затем удаляет поле 5 с помощью splice()
.
Все это делается с помощью auto -split array @F
, который в Perl эквивалентен $1, $2, $3 и т. д. в awk, когда perl вызывается либо с -F
, либо с -a
.
Затем он печатает массив @F, соединенный вертикальной чертой |
, независимо от того, изменились ли поля 4 и 5 или нет.
Примечание. :Perl-массивы начинаются с нуля, а не с единицы. $#F
возвращает последний номер индекса массива @F, поэтому тест == 7
, а не == 8
. В записи с 8 полями @F будет иметь индексы 0..7. Это также означает, что 5-е поле (Адрес )обозначается как $F[4]
, а не $F[5]
.
Использование любого awk в любой оболочке на каждом компьютере Unix:
$ awk -F, -v OFS='|' 'NF>7{$5=$5",\n"; sub(/\n./,"")} 1' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
$5=$5",\n"
добавляет ,
и новую строку (, которые иначе не могут присутствовать в текущей записи, поскольку записи разделяются символами новой строки )в конец поля 5, что в результате изменения поля заставляет awk перестроить $0
, заменяя все ,
между полями (, то есть все запятые в записи, кроме запятой, которую мы только что сделали частью поля 5 ), поэтому мы получаем ...|field4|field5,<newline>|field6|field7|...
.
sub(/\n./,"")
удаляет единственный <newline>|
, который может существовать в записи, то есть тот, который находится между field5,
и field6
, поэтому у нас остается ...|field4|field5,field6|field7|...
, который является желаемым результатом.