Intereting Posts
Есть ли способ синхронизации только одного раздела? Запишите переменную, содержащую большой текст, с \ n в файл с обычными интерпретаторами интерпретаторов. Как ты делаешь это? Как исправить предупреждение об ошибке не удалось подключиться к lvmetad, нет такого файла или каталога, возвращающегося к внутреннему сканированию в ubuntu 15.10 Загрузите, добавив после некоторого процентного завершения Как навалом сжимать разные подпапки? Общая спецификация интерфейса командной строки Как я могу передать только stderr в zsh? Как добавить значок корзины в избранное Gnome 3? размещение данных с использованием cURL в скрипте Разрешения для файлов при передаче на другой сервер присвоение номера wlan Фильтрация вывода журнала на отдельных линиях Нельзя подписывать / шифровать, если я не запускаю gpg-agent вручную Общий конфликт разделов NTFS, файлы, написанные под Debian Диск по-прежнему заполнен после удаления некоторых файлов

Я бы хотел использовать одну из трех команд sed (диапазоны чисел)

Существует один текстовый файл (test.txt)

1970-01-01 1971-01-01 1972-01-01 1973-01-01 1974-01-01 .... 1993-01-01 1994-01-01 1995-01-01 1996-01-01 ... 2015-01-01 2016-01-01 

Я хотел бы прояснить строку текста выше в 1995 году с 1970 года.

Ниже приводится команда sed, которую я сделал.

 sed -i '/197[0-9]/d' test.txt sed -i '/198[0-9]/d' test.txt sed -i '/199[0-5]/d' test.txt 

Есть ли способ использовать три команды в одной команде sed?

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

например

 sed -i '1,/^1995/d' test.txt 

Если дата начинается до 1970 года, то

 sed -i '/^1970/,/^1995/d' test.txt 

Если ваш файл не в порядке, тогда нет простого регулярного выражения (есть длинный скучный), который будет соответствовать всем строкам, но вы можете указать несколько

 sed -i -e '/^19[78][0-9]/d' -e '/^199[0-5]/d' test.txt 

Когда применяется арифметика, часто проще использовать awk. Например, чтобы напечатать все строки, кроме тех, которые были между годами между 1970 и 1995 годами:

 $ awk -F- '$1<1970 || $1 > 1995' test.txt .... 1996-01-01 ... 2015-01-01 2016-01-01 

Здесь -F- указывает awk на использование - как разделитель полей. Это означает, что первым полем, обозначенным $1 , будет год.

В отличие от sed, awk делает математику. Таким образом, $1<1970 истинно, если год меньше 1970 года. $1 > 1995 истинно, если год больше, чем в 1995 году. || объединяет эти два условия с логическим-ИЛИ. Таким образом, $1<1970 || $1 > 1995 $1<1970 || $1 > 1995 верен для тех лет, которые вы хотите сохранить.

Вы можете комбинировать три в одном регулярном выражении.

 sed -i '/19[789][0-9]/d' test.txt 

Третий символ проверяется на «7», «8» или «9».

Вы также можете добавить якорь для начала строки.

 sed -i '/^19[789][0-9]/d' test.txt 

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