пакетное или perl изменение формы текстового файла - PullRequest
1 голос
/ 12 декабря 2011

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

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 ]

2 голосов
/ 12 декабря 2011
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

1 голос
/ 12 декабря 2011

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

#!/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
1 голос
/ 12 декабря 2011
perl -l -00 -aF/\s*\n\s*/ -ne 'print "@F"' /source/file > /dest/file

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

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