Удалите точно такие же совпадающие строки с sed

Есть несколько команд, которые вы можете ввести для просмотра содержимого файлов. Это:

  • vim или vi , которые подходят для просмотра текстовых файлов и создания оболочки. скрипты
  • less или more , что хорошо для просмотра файлов журнала (я считаю less более полезным в этом случае). Вы не можете ничего изменить с помощью меньше или больше , но это удобно для просмотра.
  • gedit - инструмент с графическим интерфейсом , отображающий файлы text / log / conf.
  • cat может отображать содержимое файла, но лучше использовать less
1
24.06.2015, 20:05
1 ответ

Ваши шаблоны sed не соответствуют закреплены на конце, чтобы они соответствовали новым строкам. Другое решение - изменить строки вместо удаления и чтения.

Сначала давайте посмотрим, сможем ли мы сделать исходный сценарий немного более читабельным, не будучи таким широким:

sed -i -r '/deb http\:\/\/httpredir\.debian\.org\/debian jessie main/d' /etc/apt/sources.list
sed -i -r '/deb http\:\/\/httpredir\.debian\.org\/debian jessie\-updates main/d' /etc/apt/sources.list
sed -i -r '/deb http\:\/\/security\.debian\.org jessie\/updates main/d' /etc/apt/sources.list
cat >> /etc/apt/sources.list << EOF
deb http://httpredir.debian.org/debian stable main contrib non-free
deb-src http://httpredir.debian.org/debian stable main contrib non-free
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb http://security.debian.org jessie/updates main contrib non-free
deb-src http://security.debian.org jessie/updates main contrib non-free
EOF

Ты на самом деле знаю, глядя на это, нет причин, по которым мы не можем сделать все с помощью одной команды sed.

sed /etc/apt/sources.list -i \
  -e '\!deb http://httpredir\.debian\.org/debian jessie main$!d' \
  -e '\!deb http://httpredir\.debian\.org/debian jessie-updates main$!d' \
  -e '\!deb http://security\.debian\.org jessie/updates main$!d' \
  -e '$a \
deb http://httpredir.debian.org/debian stable main contrib non-free\
deb-src http://httpredir.debian.org/debian stable main contrib non-free\
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free\
deb-src http://httpredir.debian.org/debian jessie-backports main contrib non-free\
deb http://httpredir.debian.org/debian jessie-updates main contrib non-free\
deb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free\
deb http://security.debian.org jessie/updates main contrib non-free\
deb-src http://security.debian.org jessie/updates main contrib non-free'

Итак, давайте поговорим о том, что я сделал. Сначала нужно было добавить $ в конец шаблонов, хотя на данный момент это не нужно, потому что с использованием одной команды sed ваше окно состояния гонки намного уже, возможно, даже удаляется, потому что исходный файл остается на месте до тех пор, пока sed не будет завершен. в этот момент sed копирует свой временный файл поверх оригинала, и это происходит только один раз. следующий - уменьшить чрезмерное побег.в частности - и: не являются специальными символами ни в базовых, ни в расширенных регулярных выражениях, поэтому они не нуждаются в экранировании (и это может официально привести к неопределенному поведению в POSIX, но редко на практике). Пока мы находимся в этом, нужно избежать множества косых черт, поэтому давайте изменим наш разделитель на! поскольку он нигде не используется с помощью оператора соответствия \ c. И, говоря о различиях между базовыми и расширенными регулярными выражениями, вы не используете ни один из оспариваемых операторов, поэтому не имеет значения, как интерпретируются ваши шаблоны, поэтому давайте отбросим параметр -r.Теперь, поскольку мы используем несколько команд sed в одном вызове sed, нам нужна опция -e, и она нужна нам для каждой команды sed. В этом случае это дает дополнительное преимущество, заключающееся в том, что команды не должны быть перед изменяемыми файлами. И мы завершаем это командой a для добавления новых строк, и мы ограничиваем ее с помощью $, поэтому мы делаем это только в последней строке. Мы могли бы спасти шесть персонажей, не убегая. поскольку он совпадает с самим собой и вряд ли сопоставит что-либо еще с длинными шаблонами и природой URL-адресов, но достаточно хорошо.

или вот версия perl:

perl -pi \
  -e 'next if m!deb http://httpredir\.debian\.org/debian jessie main$!;' \
  -e 'next if m!deb http://httpredir\.debian\.org/debian jessie-updates main$!;' \
  -e 'next if m!deb http://security\.debian\.org jessie/updates main$!;' \
  -e 'END print "
deb http://httpredir.debian.org/debian stable main contrib non-free
deb-src http://httpredir.debian.org/debian stable main contrib non-free
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb http://security.debian.org jessie/updates main contrib non-free
deb-src http://security.debian.org jessie/updates main contrib non-free\n";}'

, которая может быть такой:

perl -pie 'next if m! Deb http: // httpredir \ .debian \ .org / debian jessie main $! ; далее, если m! deb http: // httpredir \ .debian \ .org / debian jessie-updates main $ !; далее, если m! deb http: // security \ .debian \ .org jessie / updates main $ !; END {print "deb http://httpredir.debian.org/debian stable main contrib non-free \ ndeb-src http://httpredir.debian.org/debian stable main contrib non-free \ ndeb http: // httpredir .debian.org / debian jessie-backports main contrib non-free \ ndeb-src http://httpredir.debian.org/debian jessie-backports main contrib non-free \ ndeb http://httpredir.debian.org/debian jessie-updates main contrib non-free \ ndeb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free \ ndeb http://security.debian.org jessie / updates main contrib non-free \ ndeb-src http://security.debian.org jessie / updates main contrib non-free \ n ";} '

1
27.01.2020, 23:50

Теги

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