LINUX.ORG.RU

[sed] Делу время и потехе час

 


0

0

Привет, ЛОР!

sed — это не только мощный инструмент для работы, но и весёлые развлечения!

Вот, чтобы повеселть себя и других, написал quine — скрипт, который выводит сам себя.

#!/bin/sed -f
s/^/\/;h;s\/\\\\\/\\\\\\\\\/g;s\/\\\/\/\\\\\\\/\/g;G;s\/\\n\/\/;s\/^\/#!\\\/bin\\\/sed -f\\ns\\\/^\\\/\/;q/;h;s/\\/\\\\/g;s/\//\\\//g;G;s/\n//;s/^/#!\/bin\/sed -f\ns\/^\//;q

А чем забавляетесь вы?

★★★★★

>А чем забавляетесь вы?

Сплю с женщинами. Впрочм готов признать что quine на sed'е гораздо круче.

KblCb ★★★★★
()

>А чем забавляетесь вы?

Сплю с женщинами. Впрочм готов признать что quine на sed'е гораздо круче.

KblCb ★★★★★
()

скажите пожалуйста, как посредством sed сделать такое:

есть файл подобного вида:

hello [[hello]] buy buy [[hola | holalala]]

и вот нужно чтобы скрипт удалял последовательности начиная с '[[' и заканчивая '|', но чтобы он это делал только в случае если после '[[' НЕ шло ']]'

:)) вопщем на выходе требуется получить такое

hello [[hello]] buy buy holalala]]

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

elfrock
()
Ответ на: комментарий от elfrock

>весь день бьюсь пытаясь разобраться в регулярках...

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

dimon555 ★★★★★
()
Ответ на: комментарий от anarquista

спасибо большое!

я до этого пытался вот так: sed 's/\[\[[^\|]*\|//g'

в итоге конечно удалялось все содержимое от [[ до первого |

в вашем примере (я кстати не понял зачем вторая часть, та что после ;) все удалялось правильно, но только для первого случая, тоесть остальные подобные последовательности в строке оставались, решилось конечно добавлением 'g'

sed 's/\[\[[^]|]*|//g' file

для чего была вторая часть команды?

elfrock
()
Ответ на: комментарий от elfrock

Вынужден извиниться: я ввёл недостаточно правильные команды… ведь возможен такой случай:

[[abcd]efg]hi|jk]]hello]]

исходя из задания, должно остаться:

jk]]hello]]

моя команда не сработает. вот правильно обрабатывать все случаи с отдельным ] — этого я не сделал…

anarquista ★★★★★
() автор топика
Ответ на: комментарий от anarquista

очередной раз прошу помощи!

подскажите, как вот в таком примере:

hello [[hello | [hola])]] good [[buy]]

сделать так, чтобы заменить на такое:

hello <A>[hola])<B> good <A>buy<B>

пытаюсь добиться этого таким скриптом:

sed '/\[\[.*|.*\]\]/s/\[\[[^]|]*|/<A>/g; s/<A>[^]]*\]\]/&<B>/g; s/\[\[[^]]*\]\]/<A>&<B>/g; s/\[\[//g; s/\]\]//g'

но получается:

hello <A> [hola<B>) good [[buy]]

тоесть вопрос вот в чем - как указать, что должно быть 2 символа ]] в ряде [^]]?

чтото никак не одолею

elfrock
()

Вот сделал другой, возможно, более оптимальный вариант:
без слэш-заборов.

#!/bin/sed -f
s%^%;H;x;s,;,;s/$/,9;s,q,q/,3;G;s,^,#!/bin/sed -f,;%;s/$/s,;,s%^%;,;s,;,;%;,9;q/
;H;x;s,;,;s/$/,9;s,q,q/,3;G;s,^,#!/bin/sed -f,;s,;,s%^%;,;s,;,;%;,9;q








anarquista ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.