Вы можете подойти к этому, используя следующие методы:
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"
Только когда у нас в массиве @F
больше 2 элементов, то есть в текущей записи было хотя бы 2 точки, мы выбираем такую запись для модификации.
Для такой записи функция splice @F, 1
удаляет элементы, начиная со 2-го и далее, и представляет их функции join
, которая затем соединяет их с помощью символа точки, который затем вставляется внутрь $_
, также известной как текущая запись..
Опция -p
выводит эту измененную текущую запись на стандартный вывод. Тот, который не изменился, в любом случае молча выводится на стандартный вывод.
Используя GNU sed
мы также можем выполнить задачу, не прибегая к захвату скобок:
sed -e
s/\./\n/2;T
y/\n./.\n/
s/\n/./2g
s/.*\n//
' input.file
Выход:
akamai.com
cloudflare.com
cdn.cloudflare.net
Вы можете использовать символические ссылки:
ln -s /etc /test
Это создаст ссылку из /etc в /test, если вы измените что-то в /test, это будет изменено и в /etc.
Вы можете использовать жесткие ссылки для файлов:
ln file testfile
Как и в случае с символическими ссылками, если вы измените testfile
, file
также будет изменен.
also if I remove it from /test will be removed /
будьте осторожны при удалении символических ссылок, не делайте rm -r test/ *, потому что это приведет к удалению /etc. Вместо этого используйтеunlink(1)
unlink /test