Как с помощью SED заменить строку на несколько строк?
Предположим, у меня файл, в котором есть срока, содержащая `123456`
Как с помощью sed (или чего-либо еще) заменить в файле строку, содержащую `123456` на несколько других строк?
И как можно выделить несколько строк, например 5, если в первой содержится `123456`, и заменить их на одну, или тоже на несколько строк?
Или может подойдёт не SED, а AWK или Perl? Это не так важно, главное чтобы оно умело работать с файлом (без всяких `cat` там), и синтаксис был не совсем ужасный.
Подходит, кстати. Просто до этого не получалось, потому что у меня перенос строки идет после символа "\", а сейчас я понял, что там надо тогда \\\n делать
Спасибо!
Ну перл очень хорош для парсинга текста. Для этого и писался.
Можно питон, он универсальный.
Можно php, он прост.
Любой из них, какой ближе.
С другой стороны не очень ясно что у вас за текст. Например html тексты уже давно не парсят вручную - есть огромное количество готовых библиотек для этого.
Опять же, возможно можно переделать на sql.
Тогда в принципе можно их структурировать и оставаться с SED
SED позволяет выделять блоки текста, в которых можно делать замену, но замену он все равно будет выполнять построчно, в каждой строке блока.
например
sed -i -r "2,5s/.*/# deleted line/g" file.txt
Очистит строки со 2 по 5.
sed -i -r "/text1/,/text2/s/.*/# deleted line/g" file.txt
очистит строки между text1 и text2 включительно (все совпадения)
sed -i -r "/text1/,+2s/.*/# deleted line/g" file.txt
очистит строку где встретился text1 и две следующие
Так что можете расставить якоря и править через sed
perl я предлагал, потому что в свое время писал на нем много велосипедов, и считаю, что питон и php по простоте никогда не догонят работу с текстом на перле.
Для awk замена одной стоки: /123456/{sub( /.*/, "text")}
text может содержать \n для перевода строк.
А вот удалить несколько строк после нахождения совпадения поиска немного сложнее. Я бы уже написал коротенькую программу на перле вместо однострочника.