Добавление места легко в zfs (, btrfs и lvm2)
zpool add $POOL mirror $A $B
https://docs.oracle.com/cd/E53394_01/html/E54801/gayrd.html#scrolltoc
Использованиеawk
:
awk -F'-$' '{ printf "%s", sep $1; sep=/-$/?"":OFS } END{ print "" }' infile
с помощью -F'-$'
, мы определилиF поле S разделитель для одиночного дефиса в конце строки, поэтому с этим и, взяв первое поле $1
, у нас всегда будет строка без этого дефиса для тех строк, у которых есть этот дефис, или целая строка для тех, у кого нет этого дефиса.
затем мы просто печатаем его сsep
между ними, но это меняется при чтении следующей строки на пустую строку -, если текущая строка заканчивалась дефисом, в противном случае OFS(O вывода F поле S разделитель , по умолчанию используется пробел ).
в блокеEND{...}
мы добавляем последний символ новой строки, чтобы сделать его текстовым файлом POSIX , если вы не хотите, чтобы это добавлялось, просто удалите эту часть.
Используя sed
, альтернативно:
sed ':loop /-$/N;s/-\n//;t loop; N;s/\n/ /;t loop' infile
/-$/
), прочитайте N ext строку и замените «дефис+ \n
ewline» пустой строкой. t
), то перейти к метке цикла и обработать следующую строку и пропустить выполнение остальной части кода. \n
ewline между этими двумя строками символом пробела. sed -e ':again' -e '/[[:alpha:]]-$/ { N; s/-\n//; b again; }' file |
paste -s -d ' ' -
Здесь используется sed
соединение строк через дефис. Он делает это, обнаруживая строки, в которых есть дефисы, которым непосредственно предшествует буква в конце строк. Сопоставляя [[:alpha:]]
перед тире, я более уверен, что удаляю только тире, используемые для переноса. Затем строки с дефисом соединяются со следующей строкой путем чтения следующей строки с N
(, которая вставляет буквальный символ новой строки )и удаляет -\n
. Затем соединенная строка повторно -проверяется на наличие переносов (это то, что делает ветвь b again
к метке again
).
Затем используется утилита paste
для вставки всех строк в одну непрерывную строку. Параметр -s
используется для объединения всех строк в одну строку, а параметр -d ' '
используется для указания символа-разделителя, используемого при объединении строк.
Я мог бы использовать tr '\n' ' '
вместо команды paste
, с которой я закончил, но это дало бы мне незавершенную строку (без символа новой строки в конце ).
Использование утилиты редактирования потоков POSIX sed .
sed -e ':a
$!N
s/-\n//;ta
s/\n/ /;ta
' file
С помощью утилиты awk мы настраиваем цикл для чтения следующей строки и управления ORS для печати предыдущей строки.
awk '
{
while (getline t > 0) {
ORS = sub(/-$/, "") ? "" : OFS
print
$0 = t
}
ORS = RS
}
1' file
Мы можем переставить разделитель выходных записей $\
в зависимости от состояния текущей записи.
perl -lpe '
$\ = eof ? $/
: s/-$// ? $,
: $"
;
' file
$/
— разделитель входных записей, по умолчанию — новая строка. $"
— разделитель элементов массива в кавычках, по умолчанию — пробел. $,
является разделителем полей вывода и по умолчанию представляет собой пустую строку. Другое perl
решение (, предполагающее, что последняя строка не заканчивается символом -
):
perl -pe 's/-\n//; s/\n/ / if !eof'
В отличие от sed
или awk
, разделителем записей можно напрямую управлять с помощью perl
. Таким образом, легко удалить, если соответствует -\n
. s/\n/ / if !eof
затем заменит оставшиеся символы новой строки пробелом, за исключением последней строки.
Если вам не нужен лишний пробел в конце, вы можете удалить часть if !eof
.
awk '{gsub(/-$/,"",$0)}ORS=" "{print $0}' filename
выход
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accu sam et justo duo dolores et ea rebum. - Stet clita kasd guber gren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
команда:perl -pne 's/-$//g;s/\n//g' filename
выход
Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod temporinvidunt ut labore et doloremagna aliquyam erat, sed diamvoluptua. - At vero eos et accusam et justo duo dolores et earebum. - Stet clita kasd gubergren, no sea takimata sanctusest Lorem ipsum dolor sit amet
В зависимости от того, как вы хотите обрабатывать пустые строки:
$ awk -v RS= '{gsub(/-\n/,""); $1=$1} 1' file
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
или это (, если ваш awk поддерживает многосимвольный -RS, например. GNU awk):
$ awk -v RS='^$' '{gsub(/-\n/,""); $1=$1} 1' file
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
может быть тем, что вы хотите.