Извлечение определенных значений из текста

Я не знаю этого по факту, но я бы предположил, что Disk Utility сообщает вам фактический размер, а Gparted сообщает вам о рабочем размере, так как файловая система и таблица разделов занимают немного места. Размеры размещения не являются фактором, поскольку они не занимают места, это всего лишь настройка.

1
задан 24 August 2016 в 19:21

2 ответа

Поскольку порядок может измениться, это займет немного скриптов. Вот версия Perl:

#!/usr/bin/perl -nl

my $time = $1 if /\[(.+?)\]/; 
my $city = $1 if /city=(.*?)(&|$)/;
my $lang = $1 if /language=(.*?)(&|$)/;
my $x = $1 if /\bx=(.*?)(&|$)/; 
my $y = $1 if /\by=(.*?)(&|$)/; 
my $z = $1 if /\bz=(.*?)(&|$)/;
print join ",", ($time, $city, $lang, $x, $y, $z)

Сохраните это как foo.pl, сделайте его выполнимым (chmod +x foo.pl) и запустите его следующим образом:

./foo.pl file.txt

Вы также можете сжать

Объяснение

-n означает «читать входной файл по строкам и применять сценарий к каждой строке. [

]

f7] добавляет новую строку для каждого вызова print и переводит строки новой строки из каждой строки ввода.

В каждом случае мы используем регулярное выражение для поиска целевой строки и присваиваем ее переменной, если совпадение было первое регулярное выражение, \[(.+?)\] соответствует любому значению между [ и первым ]. Скобки вокруг .+ - это группы захвата, и мы будем ссылаться на то, что было зафиксировано как $1. Итак, $time ] будет тем, что было внутри [ ].

Другие регулярные выражения следуют той же идее. \b означает «символ без слова» и гарантирует, что y= не будет соответствовать city и т. д. (&|$) означает захват групп a & или конец строки ($) и необходим для захвата паттернов в самом конце t он линия.

Наконец, мы join с запятыми и напечатаем их.

7
ответ дан 23 May 2018 в 06:50

Поскольку порядок может меняться, это немного сложнее, но sed может справиться с этим:

s/\[(.*)\](\/segment\?)(.*)/\3,\1/ #Match text between [], append to end of line and remove /segmennt?
s/city=([^&,]*)[&,](.*)/\2,\1/     #Match city= followed by any character
s/language=([^&,]*)[&,](.*)/\2,\1/ #except & and , which are the separators and append to end of line
s/x=([^&,]*)[&,](.*)/\2,\1/
s/\by=([^&,]*)[&,](.*)/\2,\1/      #Avoid matching city again by making sure y is at a word boundary 
s/z=([^&,]*)[&,](.*)/\2,\1/

Запуск от имени: sed -rnf scriptfile inputfile

0
ответ дан 23 May 2018 в 06:50

Другие вопросы по тегам:

Похожие вопросы: