Перемещение строки с выхода на фронт вывода или пользовательское переупорядочение

У меня есть команда find "$PWD" -name __openerp__.py|awk -F/ -vOFS=/ 'NF-=2'|sort -u и я хочу взять определенную строку, содержащую /web/addons и нажать ее на фронт вывода затем делает то же самое с /openerp/addons делая так, чтобы строка с /openerp/addons была первой, а строка с /web/addons была бы второй.

Я решил использовать grep с этим вводом и с тем же выходом – grep с подстановочным знаком и исключить, но все же выяснить, как передать выходные данные на несколько greps. Также есть несколько способов сделать это.

Так что прямо сейчас я получаю:

 <my path>/addons <my path>/development <my path>/external <my path>/server/openerp/addons <my path>/web/addons 

И я хочу, чтобы это стало:

 <my path>/server/openerp/addons <my path>/web/addons <my path>/addons <my path>/development <my path>/external 

PS Реверс сортировки не решит этого

Я не уверен, что понимаю, что вы пытаетесь сделать здесь, но если вы хотите, чтобы строка с /openerp/addons была первой, а /web/addons – второй, почему бы не просто что-то вроде этого:

 find "$PWD" -name '__openerp__.py' | awk -F/ -vOFS=/ 'NF-=2' | sed 's#^\(.*/openerp/addons.*\)#aaa%\1#; s#^\(.*/web/addons.*\)#aab%\1#' | sort -u | sed 's/^aa.%//' 

Не особенно умный или элегантный, но это просто добавит aaa% к началу строк, содержащих /openerp/addons и aab% к началу строк, содержащих /web/addons . Последний sed удаляет их снова после сортировки. Предполагая, что у вас нет файлов, имя которых начинается с aa.% , Что должно иметь желаемый результат.

Или, вы могли бы использовать простой perl one-liner, который также выполняет работу sort -u :

 find fafa/ | awk -F/ -vOFS=/ 'NF-=2' | perl -ne 's#^(.*/openerp/addons)#aaa%$1#; s#^(.*/web/addons)#aab%$1#; $k{$_}++; END{for (sort keys(%k)){s/^aa.%//; print }}' 

Как я упоминал в комментарии , трубопроводы – это не путь; по крайней мере, не с инструментом, столь же простым, как grep . Для этого я использовал бы более мощный инструмент, такой как Python или Perl. Вот фильтр Perl, который может помочь:

 your command | perl -ne ' if($already_found_lines){ print # print the current line as is } else{ if (m{/web/addons} ) { $web=$_ and $found_web++ } elsif(m{/openerp/addons}) { $openerp=$_ and $found_openerp++} else { push @buffer,$_ } $already_found_lines = ($found_web and $found_openerp); if($already_found_lines) { print "${openerp}$web";print for @buffer} }' 

Это проверено правильно с вашим вводом образца.

Прямо сейчас я сделал это, сохранив в /tmp/ а затем несколько раз выполнив grep:

 find "$PWD" -name '__openerp__.py' | awk -F/ -vOFS=/ 'NF-=2' | sort -u > /tmp/openerp_addon_list.txt ; (egrep '/openerp/addons|/web/addons$' /tmp/openerp_addon_list.txt; egrep -v "/openerp/addons|/web/addons|/openerp/test" /tmp/openerp_addon_list.txt) /home/domas/Sources/openerp/7.0/server/openerp/addons /home/domas/Sources/openerp/7.0/web/addons /home/domas/Sources/openerp/7.0/addons /home/domas/Sources/openerp/7.0/development /home/domas/Sources/openerp/7.0/external /home/domas/Sources/openerp/7.0/groups/account-invoice-report /home/domas/Sources/openerp/7.0/groups/banking-addons /home/domas/Sources/openerp/7.0/groups/partner-contact-management /home/domas/Sources/openerp/7.0/groups/sale-reports /home/domas/Sources/openerp/7.0/groups/webkit-utils