@murmuringvoices
Звукорежиссер

Как с помощью SED заменить строку на несколько строк?

Предположим, у меня файл, в котором есть срока, содержащая `123456`
Как с помощью sed (или чего-либо еще) заменить в файле строку, содержащую `123456` на несколько других строк?

И как можно выделить несколько строк, например 5, если в первой содержится `123456`, и заменить их на одну, или тоже на несколько строк?

Или может подойдёт не SED, а AWK или Perl? Это не так важно, главное чтобы оно умело работать с файлом (без всяких `cat` там), и синтаксис был не совсем ужасный.

Спасибо!
  • Вопрос задан
  • 2250 просмотров
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
А чем не устраивает перенос строки с \n?
sed s/123456/Hello\nWorld/ file.txt
или я неверно понял задачу?

Несколько строк заменить вряд ли выйдет, 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 и две следующие
Ответ написан
vaut
@vaut
Для awk замена одной стоки: /123456/{sub( /.*/, "text")}
text может содержать \n для перевода строк.

А вот удалить несколько строк после нахождения совпадения поиска немного сложнее. Я бы уже написал коротенькую программу на перле вместо однострочника.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы