
У меня есть файл с названиями стран и префиксом мобильного кода страны для этой страны, например:
United Kingdom +44 ...more fields
United States Virgin Islands +1 ...more fields
Мне нужно получить название страны и мобильный префикс. Поэтому регулярное выражение выглядит так: прочитать все слова с начала строки, а затем строку, которая начинается с плюса и еще одной цифры, а затем остановиться.
Я пробовал кое-что с grep, cut и даже sed, но ничего не получилось.
решение1
попробуйте с:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
соответствует всему, пока не +
будет найден первый символ, за которым последует одна или несколько цифр[0-9]\+
решение2
Командная строка:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
Это позволит вам получить желаемую информацию из входных данных.
Работающий:
/^(.*?\+\d+)/
Регулярное выражение извлечет все до первого вхождения символа плюс, за которым следует по крайней мере один символ цифры.- Поскольку это связано с символом «
BOL
каретка^
», очевидно, что может произойти только одно совпадение. - Сопоставление передается функции
print
. -lne
параметры запускаютPerl
код, указанный в-e
параметре, в каждой строке входного файла.-n
заставляет Perl не печатать ничего, если об этом специально не указано.
Выход:
United Kingdom +44
United States Virgin Islands +1
решение3
Сты говоришь космосявляется разделителем, используемым в вашем файле, вы должны иметь возможность использовать
cut -d ' ' -f 1-5 filename
для извлечения первых пяти столбцов из файла.
Для приведенных данных это дает
United Kingdom +44
United States Virgin Islands +1
... но я предполагаю, что это всего лишь удача, поскольку страна, в названии которой содержится более двух слов, будет охватывать несколько областей (а не только две).
Более надежный метод, использующий sed
удаление всего после первого набора цифр в каждой строке (т.е. всего после кода страны):
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
или,
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
или, -E
вместо этого, с расширенным регулярным выражением,
sed -E 's/([[:digit:]]+).*/\1/' filename