Поскольку порядок может измениться, это займет немного скриптов. Вот версия 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 означает «читать входной файл по строкам и применять сценарий к каждой строке. [
В каждом случае мы используем регулярное выражение для поиска целевой строки и присваиваем ее переменной, если совпадение было первое регулярное выражение, \[(.+?)\] соответствует любому значению между [ и первым ]. Скобки вокруг .+ - это группы захвата, и мы будем ссылаться на то, что было зафиксировано как $1. Итак, $time ] будет тем, что было внутри [ ].
Другие регулярные выражения следуют той же идее. \b означает «символ без слова» и гарантирует, что y= не будет соответствовать city и т. д. (&|$) означает захват групп a & или конец строки ($) и необходим для захвата паттернов в самом конце t он линия.
Наконец, мы join с запятыми и напечатаем их.