Пакетный или perl-преобразование txt файла

Я хотел бы написать сценарий, который преобразует текстовый файл, который выглядит так:

word1
word2
word3
word4
word5
word6
word7
word8
word9
word10
word11
word12
...

в это:

word1 word2 word3 word4
word5 word6 word7 word8
word9 word10 word11 word12
...

Кто-нибудь знает простой способ сделать это?

3 ответа

perl -i.bak -pwe 's/\S\s*\K\n$/ /' input.txt
  • -i.bak сохраняет резервную копию в input.txt.bak
  • -p помещает цикл while (<>) вокруг вашего скрипта
  • Регулярное выражение ищет строку, которая заканчивается символом без пробела, за которым не следует пробел, а затем строка новой строки и заменяет новую строку пробелом. Уклонение \K означает "держать что-либо до этого".

Другой вариант:

perl -i.bak -lpwe 'BEGIN { $/="" }; s/\n/ /g' input.txt

Используя режим абзаца в блоке BEGIN и после каждой печати с новой -l с -l


perl -l -00 -aF/\s*\n\s*/ -ne 'print "@F"' /source/file > /dest/file

Объяснение (с использованием предложений TLP)

  • -l: записи авто-chomp и делает акт print как say.
  • -00: помещает perl в "режим абзаца" и ищет последовательные "\n\n",
  • -a: автоматическое разделение записей в массиве полей @F
  • -F: используйте следующий шаблон для разделения записи (с использованием автоматического разделения).
  • -ne: выполните следующие действия для каждой записи (с разделителем "\n\n"), только распечатывайте, когда сказано


Похоже, что ваши группы являются "абзацами", поэтому читайте их как таковые; разделить слова на пробелы; присоедините их к одному пространству (пробел) и распечатайте результат:

#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '';
my @words;
while (<data>) { @words = split; print join q( ), @words, "\n"; @words = ();
}
__DATA__
word1
word2
word3
word4
word5
word6
word7
word8
word9
word10
word11
word12
</data>

licensed under cc by-sa 3.0 with attribution.