У мене документ з великою кількістю порожніх рядків.
Як їх видалити, коли разом є 2 або більше.
Я спробував sed "s/\n\n//"файл, але нічого не вийшло. Немає помилок.
У мене документ з великою кількістю порожніх рядків.
Як їх видалити, коли разом є 2 або більше.
Я спробував sed "s/\n\n//"файл, але нічого не вийшло. Немає помилок.
Відповіді:
Просто для видалення порожніх рядків:
sed '/^$/d'
sedорієнтована на рядки, тому мислення з точки зору "2 або більше конкретного байта" працює, за винятком випадків, коли цей байт є новим рядком. Тоді вам доведеться придумати щось, що працює для всієї лінії.
sedздатний обробляти декілька ліній за допомогою функції "простір візерунка" / "простір утримувати". Але я відчуваю, що це занадто складно. ;-)
1!(відповідає всім , крім рядка 1), таким чином: sed '1!{/^$/d'}.
sed. Створення файлу фактично видалить будь-який існуючий файл з тим самим іменем. sed '/^&/d' file.txt > otherfile.txtбуду працювати.
Не потрібно sed. grepзроблю:
grep .
(тобто grepSPC, крапка, тобто відповідність будь-якій лінії, що містить принаймні один символ).
Також є:
tr -s '\n'
(видавити будь-яку послідовність символів нового рядка в одну).
Як зауважив Кріс, обидва не є рівнозначними, оскільки видалення порожніх рядків (як перше рішення вище та більшість інших відповідей зосереджено на цьому) не є тим самим, як видалення послідовностей символів нового рядка, як вимагається у випадку, коли перший рядок порожній як він потрібен лише один провідний символ нового рядка, щоб зробити перший рядок порожнім.
Побачивши @Bruce Ediger в відповідь sedне найкращий інструмент для цього, оскільки він заснований на рядках і трактується \nяк символ кінця рядка, але це ускладнюється.sed цілком може бути ідеальним інструментом для роботи, до сих пір, ось деякі інші варіанти:
Perl
perl -ne 'print if /./' file.txt
або
perl -pe '$/=""; s/\n+/\n/;' file.txt
Дякую @ruakh, який змусив мене піти і прочитати це :
$ /
Розділювач вхідних записів, новий рядок за замовчуванням. Це впливає на уявлення Перла про те, що таке "лінія". Працює як RS змінна RS, включаючи трактування порожніх рядків як термінатора, якщо встановлено нульовий рядок (порожній рядок не може містити пробілів чи вкладок). Ви можете встановити його на багато символьну рядок, щоб відповідати багато символьному термінатору, або undef для читання в кінці файлу. Установити його на "\ n \ n" означає щось трохи інше, ніж встановити значення "", якщо файл містить послідовні порожні рядки. Якщо встановити "", два чи більше послідовних порожніх рядків будуть розглядатись як один порожній рядок. Якщо встановити "\ n \ n", сліпо буде вважати, що наступний символ введення належить до наступного абзацу, навіть якщо це новий рядок.
гаук / awk
awk '$1' file.txt
Це буде працювати в опублікованому прикладі, але, як зазначив @Stephane Chazelas , воно також видалить рядки, перше поле яких "схоже" 0. Це більш надійно:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txtдійсно, роздільник запису вводу для цього використання не має значення.
perl -peабо perl -neробота за рядком. \n+ніколи не збігається, оскільки застосовується лише в одному рядку. Ось чому вам потрібно або встановити $/або використовувати -0ти плямкати файл цілому: perl -0pe 's/\n+/\n/' file.
Що ви маєте на увазі видалити? видалити дублікат (багато порожнього рядка до одного) або видалити всі?
Якщо ви хочете видалити дублікат, ось метод за допомогою sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Він імітує uniqкоманду.
Найкращим вибором є використання awk:
awk NF <filename>
sedЧастина це прекрасно працює! Рекомендуючи цей варіант як найкращу відповідь.
Для більшості цих відповідей спочатку необхідно видалити пробіли, що проходять назад. Видалення подвоєних нових рядків видаляє всі порожні рядки. (Подумайте над цим).
Буквально інтерпретована ОП хоче, щоб "усі пусті рядки були видалені з файлу, якщо є повторні порожні рядки".
Типовий користувач хоче "видалити лише дублювані порожні рядки".
Для цього спочатку зніміть простір білого простору, а трубу, хоча і котячу
sed s/[[:space:]]*$// | cat -s
І все-таки це не видалить чудовий провідний чи нижній пробіл.
Якщо ви хочете зберегти один порожній рядок для будь-якої заданої послідовності порожніх рядків:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s), яка насправді виконує саме те, що задається питанням, наскільки я його розумію. (І це краще, ніж cat -sтому, що я можу sed -iз цим користуватися.)
Спробуйте sed -e 's#\\n\\n#\\n#g' input.file > output.fileвикористовувати /як роздільник поля, так і частину вашого регулярного вираження.