Перемещение шаблона в начало строки

Принятый ответ ничего не сделал для меня, однако я не перезагрузил свой компьютер, чтобы попытаться устранить проблему.

Что для меня работало:

killall -9 kdevelop

Убив все экземпляры kdevelop, я могу запустить его снова и выбрать сеанс.

1
задан 22 March 2015 в 16:32

2 ответа

с awk это гораздо более простой синтаксис

awk -F, '{print $4","$5","$6","$1","$2","$3}' file.txt
4
ответ дан 23 May 2018 в 22:11
  • 1
    Обратите внимание, что это предполагает, что каждая строка имеет одинаковое количество полей. Поскольку первые несколько кажутся переменными, это, скорее всего, не удастся. – terdon♦ 22 March 2015 в 15:50

Золотое правило регулярных выражений «меньше». Вы всегда должны пытаться написать простейшее регулярное выражение, соответствующее вашим данным. Это не только упрощает чтение и понимание, но и гораздо более надежное и не прерывается с небольшими изменениями в формате. Итак, в вашем случае вы можете просто сделать:

$ sed -r 's/(.*), ([^,]+,[^,]+,[^,]*$)/\2\1/' file 
Friday, Mar 13,2015 16:59:42blah, blah, blah, 
Friday, Mar 13,2015 16:51:11yadi, yadi, yada, 

Это соответствует всем значениям от начала строки до запятой и пробелом ((.*),) и, поскольку шаблон окружен круглыми скобками, сохраняет его как \1. Теперь, поскольку вторая захваченная группа (второй шаблон в круглых скобках) подходит к концу строки (это означает $), мы знаем, что мы соответствуем правой части в первом.

Второй ищет растягивание одного или нескольких символов без запятой ([^,]+), запятой, другим набором не запятых, другой запятой, а затем как можно большим количеством символов не запятой до тех пор, пока конец линии. Таким образом, мы можем корректно идентифицировать последние поля как дату. [F8] - это оператор подстановки, который здесь просто переключает порядок 1-го и 2-го захваченных паттернов.

Вы также можете сделать то же самое в awk. Предположительно, текст до даты является переменным, поэтому мы не можем принимать одинаковое количество полей для каждой строки. Поэтому нам нужно будет считать поля назад от конца строки:

$ awk -F, '{ 
            printf "%s,%s,%s, ", $(NF-2),$(NF-1),$NF; 
            for(i=1;i<NF-3;i++){printf "%s,", $i} print $(NF-3)
         }' file 
 Friday, Mar 13,2015 16:59:42, blah, blah, blah
 Friday, Mar 13,2015 16:51:11, yadi, yadi, yada

Или в Perl:

$ perl -lpe 's/(.*), ([^,]+,[^,]+,[^,]*$)/\2, \1/' file 
Friday, Mar 13,2015 16:59:42, blah, blah, blah
Friday, Mar 13,2015 16:51:11, yadi, yadi, yada

$ perl -F, -lane 'print join ",",@F[$#F-2,$#F-1,$#F,0..$#F-3]' file 
 Friday, Mar 13,2015 16:59:42,blah, blah, blah
 Friday, Mar 13,2015 16:51:11,yadi, yadi, yada
3
ответ дан 23 May 2018 в 22:11
  • 1
    Спасибо за все советы. sed regexing - это искусство, которое я надеюсь освоить в конце концов. – Tfb9 22 March 2015 в 20:03

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

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