Это действительно сложный вопрос.Не удалось найти ни одного регулярного выражения, которое делает это, но вы можете использовать последовательность регулярных выражений для этого:
- разбить строки, чтобы
style="blabla"
появилось в отдельной строке.(пометьте разделенные строки специальными строками, чтобы вы могли вернуться позже). - выполните манипуляции с
style="blabla"
строками. - воссоедините строки
Очистите оставшиесяспециальные маркеры.
вот как я это сделал с помощью sed (надеюсь, преобразование в стиль textmate regexp легко):
sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt | sed '/BBB/s/ //g' | sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D' | sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D' | sed -e 's/AAA//g'
Пояснение:
sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt
разбить строки со стилем = "..." на 3 строки и отметить специальными строками AAA, BBB и CCC.это приведет к тому, что файл будет выглядеть следующим образом:
AAA line before style
BBB line with style=""
CCC line after style
Затем мы применяем следующее регулярное выражение:
sed '/BBB/s/ //g'
удаляет пробелы во всех строках, начинающихся с BBB (т.е. линий стиля)
Затем мы воссоединяемся:
sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D'
добавляет строки, начинающиеся с BBB, к предыдущим строкам (и удаляет строку BBB)
И затем:
sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D'
добавляет строки, начинающиеся с CCC, к предыдущим строкам.
Наконец:
sed -e 's/AAA//g'
удаляет специальную строку AAA.
Это, безусловно, неоптимально и может быть сделано с гораздо меньшими затратамиусилия с использованием методов, отличных от регулярных выражений.(есть даже инструменты для автоматического форматирования исходного кода).Во всяком случае, это все, что я мог сделать за час.Я уверен, что существует единственное регулярное выражение, которое делает то, что вы хотите, просто трудно его найти.