Intereting Posts
Создание мастер-процесса и подключение подчиненных процессов Вход фида в / dev / tty для продолжения ssh Ошибка ssh-keygen -y: ошибка загрузки Sendmail – ошибка ввода-вывода «Преждевременная EOM» в maillogs Ошибка Rsync с использованием команды репликации с сапожником Сценарий оболочки: «если файл не используется» Системное событие на вставке адаптера переменного тока или батарее отключено? Как ограничить соединения aria2 с одним сервером, но разрешить одновременные подключения к нескольким серверам? Двойная загрузка Mint / Windows: потеряна 8 ГБ на стороне Windows Make и apt-get перестали работать Получение срока действия пароля Как установить FTP-сервер на Red Hat VM? Torrent с графическим интерфейсом для Gnome на CentOS 6? Как получится, когда x = abc, ] && echo yes || эхо не возвращается? Как я могу получить уведомление обо всем, что происходит в определенном канале в irssi?

sed удаляет все до и включая первый период, если в этой строке более одного периода, и делайте это для всего файла

sed удаляет все до и включая первый период, если в этой строке более одного периода, и делайте это для всего файла.

Перед седом:

 akamai.com cdnjs.cloudflare.com com.cdn.cloudflare.net 

После сед:

 akamai.com cloudflare.com cdn.cloudflare.net 

 $ sed '/\..*\./s/^[^.]*\.//' file akamai.com cloudflare.com cdn.cloudflare.net 

Сценарий sed сначала сопоставляет строки, содержащие не менее двух точек, используя регулярное выражение \..*\. (также могло быть написано [.].*[.] ). Для линий, соответствующих этому, выполняется подстановка, которая удаляет все, вплоть до первой точки и включительно.

Использование awk несколько затянуто по сравнению с вышесказанным:

 $ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file akamai.com cloudflare.com cdn.cloudflare.net 

Здесь, когда есть более двух разделенных точками полей, мы разделяем текущую строку на точки, а затем воссоздаем текущую запись из нее, пропуская первое поле. Конечный 1 в конце заставляет печатать каждую строку (измененную или нет).

Короче awk тем же способом, что и решение sed :

 $ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file akamai.com cloudflare.com cdn.cloudflare.net 

Вы можете подойти к этому, используя следующие методы:

 perl -lpe '$_ = $1 if /\.(.*\..*)/' input-file.txt 

при этом мы полагаемся на regex которое фокусируется на точке . персонаж, который может видеть другую точку справа. Затем все, что находится справа, захватывается и делается доступным $1 и помещается внутри текущей строки. Параметр -p для Perl затем переносит это в стандартный stdout а также в тот, который не соответствует.


 perl -F\\. -pale '$_ = join ".", splice @F, 1 if @F > 2' input.txt 
  • Входной файл читается построчно с помощью параметра -p и с помощью этого параметра также включается автопечать.

  • Каждая запись разбита на точку . и отдельные поля, хранящиеся в массиве @F проиндексированы, начиная с 0 помощью опции -a .

  • Опция -l делает RS = ORS = "\n"

  • Только когда у нас более 2 элементов в массиве @F , то есть в текущей записи было как минимум 2 точки, мы выбираем такую ​​запись для изменений.

  • Для такой записи функция splice @F, 1 удаляет элементы со второго и далее и представляет их функции join которая затем соединяет их, используя символ точки, который затем помещается в текущую запись $_ , иначе.

  • Параметр -p затем переносит эту измененную текущую запись в стандартный вывод. Тот, который не изменился, все равно молча переносится на стандартный вывод.


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

 sed -es/\./\n/2;T y/\n./.\n/ s/\n/./2g s/.*\n// ' input.file 

Выход:

 akamai.com cloudflare.com cdn.cloudflare.net