У мене документ з великою кількістю порожніх рядків.
Як їх видалити, коли разом є 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 .
(тобто grep
SPC, крапка, тобто відповідність будь-якій лінії, що містить принаймні один символ).
Також є:
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
використовувати /
як роздільник поля, так і частину вашого регулярного вираження.