Как заменить пробел другим значением?

Содержимое пакетов -dev, -bin и т. д. полностью условно, менеджер пакетов на самом деле не заботится об этом. Если вы на самом деле загружали в архив Ubuntu (или Debian ), различные инструменты (и люди )могли бы проверить, соблюдаются ли соглашения, но для локальных пакетов вам не нужно следовать им, если ты не хочешь. Тем не менее, часто есть веская причина следовать им — уменьшить путаницу, если не что иное.

Тем не менее, различные заголовки взаимосвязей между пакетами (Depends, Breaks и т. д. )поддерживают все версии; если вы правильно объявите отношения, менеджер пакетов должен помешать вам установить несовместимый набор. Даже не похоже, что вам нужны версии; только то, что libel -dev должен зависеть :от libel2 -bin, а libel2 -bin должен конфликтовать :libel1 -bin (, если они не совместимы -с возможностью установки ).

Вам могут быть полезны Руководства по политике Debian «Объявление взаимосвязей между пакетами» .

1
19.04.2021, 17:35
3 ответа

Сawk:

awk -F'|' -v OFS='|' '{if($3=="")$3=$2}1'

Простой sed, если второй столбец всегда является числом:

sed -E "s/([0-9]*)\|$/\1|\1/"
0
28.04.2021, 22:52

Использование awkи замена 3-го поля вторым, если 3-е поле не содержит не -пустых символов:

$ awk -F '|' 'BEGIN { OFS = FS } $3 !~ /[^[:blank:]]/ { $3 = $2 }; 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

Использование sedдля вставки номера 2-го поля, если 3-е поле пусто или содержит только пробелы:

$ sed 's/\([[:digit:]]\{1,\}\)|[[:blank:]]*$/\1|\1/' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

Заметив, что 3-е поле кажется всегда таким же, как и 2-е поле, мы также можем игнорировать проверку 3-го поля на что-либо и просто установить для него значение 2-го поля.

Во-первых, сawk:

$ awk -F '|' 'BEGIN { OFS = FS } { $3 = $2 }; 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

или даже

$ awk -F '|' 'BEGIN { OFS = FS } { print NR, $2, $2 }' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

, который также воссоздает 1-й столбец.

Затем с помощьюsed:

$ sed 's/|[^|]*$//; s/[[:digit:]]\{1,\}$/&|&/' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

Эта команда sedсначала удаляет последнее поле, а затем воссоздает его из поля, предшествующего удаленному полю.

Или что-то вроде

$ cut -d '|' -f 2 file | sed '=; s/.*/&|&/' | sed 'N; y/\n/|/'
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401

, который извлекает второе поле данных с помощью cut, затем использует =в sedдля перечисления строк и создания дублирования полей, а затем, наконец, прикрепляет номера строк к данным с правильным разделитель.

Вы также можете сделать это с помощью комбинации cutи pasteв оболочке типаbash(с заменой процесса):

$ paste -d '|' <( cut -d '|' -f 1,2 file ) <( cut -d '|' -f 2 file )
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
1
28.04.2021, 22:52

С помощью awk, чтобы увидеть, пусто ли $3(или нет):

awk -F'|' -v OFS='|' '$3 == "" {$3=$2} 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
  • или
awk -F'|' -v OFS='|' 'length($3) == 0 {$3=$2} 1' file
0
28.04.2021, 22:52

Теги

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