Это гораздо более сложный сценарий sed
, но он работает без цикла. Вы знаете, просто ради разнообразия:
sed 'h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g'
Это делает копию строки, расщепляет один (который станет второй половиной) на первой одинарной кавычки отбрасывая первую половину, заменяет все пробелы в вторая половина, свопирует копии, разделяет вторую, отбрасывая вторую половину, объединяет их вместе и удаляет новые строки, используемые для расщепления, и добавляет команду G
.
Edit:
Для того, чтобы выбрать конкретные строки для работы, вы можете использовать некоторые критерии выбора.Здесь я указал, что строка должна содержать знак равенства и, по меньшей мере, две одинарные кавычки:
sed '/.*=.*\x27.*\x27.*/ {h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g}'
Вы можете использовать все, что регулярное выражение работает лучше всего, чтобы включить и исключить соответственно для ваших нужд.
Хорошее решение. Кажется, что O (n) вместо моего O (n^2) [Shlemiel the Painter solution] (http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm), но этот факт, вероятно, не имеет отношения к входные длины под рукой. –
Ваши навыки sed (regex) очень заметно превосходят мои. Очень хорошее решение. Одна вещь, я думаю, я должен был упомянуть, что не каждая строка имеет. Ваше решение отлично работает для линий, которые делают. Тем, у кого нет, в конечном итоге все же скопировано. Например, строка с var x = 2; закончится как var x = 2; var x = 2; – blazeprogrammer
Для всех, кому это интересно, это решение намного быстрее, чем принятое решение, причем основное отличие заключается в том, что он работает не так, как нужно (моя ошибка, а не ответчик). В моем тестовом файле это решение занимает 0,6 с, а принятое решение занимает 19,3 с. – blazeprogrammer