Различное использование пространства удержания с помощью GNU (classic?) Sed ... для основной загрузки всего файла в пространство удержания перед объединением строк.
sed -n '1x;1!H;${g;s/\n\s*+//g;p}'
1x
в первой строке, поменять строку в пустом удерживающем пространстве 1!H
в не первых строках, добавитьк пробелу $
в последней строке: g
получить пробел (весь файл) s/\n\s*+//g
заменить символы новой строки, предшествующие +
p
распечатать все
Ввод:
line 1
line 2
+ continue 2
+ continue 2 even more
line 3
+ continued
становится
line 1
line 2 continue 2 continue 2 even more
line 3 continued
Это (или ответ Потонга) может быть более интересным, чем реализация sed -z
, если для других манипуляций с данными требовались другие команды, их можно просто вставить до 1!H
, тогда как sed -z
немедленно загружает весь файл в пространство шаблона,Это означает, что вы не манипулируете отдельными строками в любой точке.То же самое для perl -0777
.
Другими словами, если вы хотите также удалить строки комментариев, начинающиеся с *
, добавьте /^\s*\*/d
, чтобы удалить строку
sed -n '1x;
/^\s*\*/d;
1!H;${g;s/\n\s*+//g;p}'
против:
sed -z 's/\n\s*+//g;
s/\n\s*\*[^\n]*\n/\n/g'
Накопление первого в линии удержания пространстваза линией вы удерживаете вас в классической области обработки строк sed, в то время как последний sed -z
сбрасывает вас в то, что может быть некоторыми болезненными регулярными выражениями подстрок.* обратно в сед.Так что +1 за это.
Сноска для поисковых запросов в Интернете: это синтаксис списка SPICE.