скрипты bash - использование sed или awk для разделения и извлечения данных - PullRequest
0 голосов
/ 29 января 2019

У меня проблемы с конкретной ситуацией.Если у меня есть файл, заполненный записями вроде:

my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see

Используя bash, как я могу использовать как awk или sed или что-то, чтобы разделить данные в каждой строке на «.»и затем печатать только записи непосредственно перед и сразу после last".", игнорируя строки без "."?

Желаемый вывод:

example.com
somelinewithnodot
this.is
all.I
need.2see

IЯ пытался использовать sed, но у меня проблемы с настройкой регулярного выражения.Я делал такие вещи раньше, но это была минута, и я не могу вспомнить, как правильно настроить это ...

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Вы также можете попробовать Perl

perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" '

со входами

$ cat johnred.txt
my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see

$ perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" ' johnred.txt
example.com
somelinewithnodot
this.is
all.I
need.2see

$

. теряет свое особое значение при использовании в [], поэтому вы можете использовать

perl -ne ' /(^[^.]+$)|(?<=\.)([^.]+\.[^.]+$)/g and print "$1$2" ' johnred.txt

Другое решение, использующее операцию с массивом

perl -lne ' @b=$_=~/([^.]+)/g ; print $b[-2]? "$b[-2].":"", $b[-1] ' johnred.txt
0 голосов
/ 29 января 2019

Вы можете использовать замену с помощью sed:

sed 's/^\([^.]*\.\)*\([^.]\+\.[^.]\+\)$/\2/'
0 голосов
/ 30 января 2019

Это может сработать для вас (GNU sed):

sed -E 's/.*[.](.*[.].*)$/\1/' file

Сопоставьте последние два . и замените их последними . и словами по обе стороны.

Альтернатива:

sed 's/.*\.\(.*\..*\)$/\1/' file
0 голосов
/ 29 января 2019

Не могли бы вы попробовать следующее.

awk -F'.' 'NF>1{print $(NF-1) FS $NF;next} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file

ИЛИ

awk -F'.' 'NF>1{$0=$(NF-1) FS $NF} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...