Bash -удалить тире и новые -строки перед заменой новых -строк пробелами

Добавление места легко в zfs (, btrfs и lvm2)

zpool add $POOL mirror $A $B

https://docs.oracle.com/cd/E53394_01/html/E54801/gayrd.html#scrolltoc

3
02.05.2021, 05:04
6 ответов

Использование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 строку и замените «дефис+ \newline» пустой строкой.
      если замена прошла успешно (тестирование с t), то перейти к метке цикла и обработать следующую строку и пропустить выполнение остальной части кода.
    • еще,прочитайте строку N ext и замените встроенную строку \newline между этими двумя строками символом пробела.
      если подстановка и здесь прошла успешно, то перейти к метке цикла и обработать следующую строку.
5
28.07.2021, 11:35
  1. Удалите тире, используемые для переноса в конце строк (, соединяя строки с дефисом со следующей строкой в ​​процессе ).
  2. Заменить символы новой строки пробелами.
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, с которой я закончил, но это дало бы мне незавершенную строку (без символа новой строки в конце ).

3
28.07.2021, 11:35

Использование утилиты редактирования потоков 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
  • $/— разделитель входных записей, по умолчанию — новая строка.
  • $"— разделитель элементов массива в кавычках, по умолчанию — пробел.
  • $,является разделителем полей вывода и по умолчанию представляет собой пустую строку.
2
28.07.2021, 11:35

Другое perlрешение (, предполагающее, что последняя строка не заканчивается символом -):

perl -pe 's/-\n//; s/\n/ / if !eof'

В отличие от sedили awk, разделителем записей можно напрямую управлять с помощью perl. Таким образом, легко удалить, если соответствует -\n. s/\n/ / if !eofзатем заменит оставшиеся символы новой строки пробелом, за исключением последней строки.

Если вам не нужен лишний пробел в конце, вы можете удалить часть if !eof.

3
28.07.2021, 11:35
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
-1
28.07.2021, 11:35

В зависимости от того, как вы хотите обрабатывать пустые строки:

$ 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.

может быть тем, что вы хотите.

3
28.07.2021, 11:35

Теги

Похожие вопросы