Как удалить пустые строки из начала и конца файла?

Создайте (или отредактируйте, если он существует )следующий ~файл /.ssh/config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
10
14.11.2019, 17:05
5 ответов

Я предлагаю это:

printf '%s\n' "$(cat file)" | sed '/./,$!d'

Будет напечатан весь текст, кроме начальных -конечных пустых строк. Итак, если мы расширим пример:

(blank)
(blank)
line1

line2
line1

line2
line1

line2
line1



line2
(blank)
(blank)

Выводится:

line1

line2
line1

line2
line1

line2
line1




line2
6
27.01.2020, 20:00

Простой двухпроходный подход для полноты картины:

$ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
line1

line2

В приведенном выше примере строки, состоящие только из пустых символов, считаются пустыми. Если вместо этого вы хотите, чтобы строки без символов считались пустыми, просто измените NFна /./.

2
27.01.2020, 20:00

команда

sed -n '/[a-zA-Z]/,/[a-zA-Z]/p' file| awk 'OFS=":"{$2=$1;$1=NR;print }'

выход

1 line1
2 
3 line2
-1
27.01.2020, 20:00

Код не написан, но должен быть эффективный алгоритм для файла любого размера в соответствии с этими строками.

(a )Читать и игнорировать пустые строки до тех пор, пока первая не -пустая.

(b )Чтение и печать не -пустых строк до следующей пустой строки.

(c )Подсчет (n )пустых строк до следующей не-пустой строки.

(d )Если вы нажмете не -пусто, напечатайте n новых строк, и вы вернетесь в состояние (b ).

(e )Если вы нажмете EOF, вы закончите --отбросить n пустых строк перед EOF.

0
27.01.2020, 20:00

Ed и Ex — редакторы POSIX, которые могут справиться с этой задачей.

Они очень похожи, и в представленных здесь решениях edи exвзаимозаменяемы на 100 % 1 .

Общее решение

printf '%s\n' a ''. 0a ''. '?.?+1,$d' '1,/./-1d' w q | ex -s file

Если известно, что файл содержит пустые строки в начале и в конце

printf '%s\n' '?.?+1,$d' '1,/./-1d' w q | ex -s file

Если вы на самом деле имели в виду пустые 2 строки

printf '%s\n' a ''. 0a ''. '?[^[:blank:]]?+1,$d' '1,/[^[:blank:]]/-1d' w q | ex -s file

Пояснение и разбивка

Руководство всегда является лучшим объяснением, но вот обзор:

Ed и Ex всегда начинаются с последней выбранной строки, поэтому, если бы мы неукрашеннаяd(команда удаления ), она удалит последнюю строку — и они могут искать строки, соответствующие регулярным выражениям.

Некоторые команды принимают адреса («номера строк» ​​), например. 3,6dудаляет из строки с 3 по 6.

  • /regex/ищет первую строку, соответствующую «регулярному выражению».
  • ?regex?ищет первую строку, соответствующую «регулярному выражению».

Угадайте, что? Регулярное выражение также может быть адресом.

# Insert an empty line at the end
a

.
# Insert an empty line at the beginning
0a

.
# Delete from line L1 up to line L2, where
# L1 is the line below the last non-empty line: ?.?+1
# L2 is the last line: $
?.?+1,$d
# Delete from line L3 up to line L4, where
# L3 is the first line: 1
# L4 is the line above the first non-empty line: /./-1
1,/./-1d
# Write the changes to the file and quit
w
q

Зачем нам временно добавлять две пустые строки для общего решение? Потому что иначе 1,/./-1dвсегда удалял бы первую строку и ?.?+1,$dпоследний, пусть и не пустой.

1 :Но IIRC в чистой установке Debian не хватает Ed, поэтому я использую Ex.
2 :То есть визуально пустые строки, но могут содержать пробелы и табуляции.

0
30.08.2021, 11:23

Теги

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