Использование Perl Regex Multiline для переформатирования файла - PullRequest
3 голосов
/ 17 декабря 2011

У меня есть файл в следующем формате:

(данные типа 1: 1)
B
B
(данные типа 1: 2)
B
B
B
(Тип данных 1: 3)
B
..

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

(данные типа 1: 1) BB
(данные типа 1: 2) BBB
(данные типа 1: 3) B
...

Мой подход состоял в том, чтобы использовать регулярное выражение perl в командной строке,

cat file | perl -pe 's/\n(B)/ $1/smg' 

Я решил заменить символ новой строки пробелом.но это не похоже на работу.не могли бы вы мне помочь?Спасибо

Ответы [ 3 ]

5 голосов
/ 17 декабря 2011

-p читает строку за раз, поэтому после "\ n" нет ничего, с чем можно было бы сравниться.

perl -pe 'chomp; $_ = ($_ =~ /Type/) ? "\n".$_ : " ".$_'

это делает почти то, что вы хотите, но помещает один дополнительный символ новой строки в начало и теряет последний символ новой строки.

4 голосов
/ 18 декабря 2011

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

perl -l -0x28 -ne's/\n/ /g;print"($_"if$_' < file
  • -l заставляет print добавлять \n в конце каждой напечатанной строки.
  • -0x28 вызывает разделение на ( вместо \n.
  • -n вызывает петлю на входе. В основном это добавляет while(<>){chomp $_; к началу и } в конце того, что когда-либо было в -e.
  • s/\n/ /g
  • print "($_" if $_ Часть if $_ просто останавливает печать дополнительной строки в начале.
1 голос
/ 17 декабря 2011

Это немного сложнее, поскольку -n и -p подходят лучше всего для обработки одной строки за раз, в то время как вам нужно объединить несколько строк, а это значит, что вам придется некоторое время поддерживать состояние.

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

perl -lwe ^
"local $/; local $_ = <>; print join q( ), split /\n/ for m/^\(Type [^(]*/gsm"

Подайте файл в эту прогу на STDIN, используя перенаправление ввода (<).

Обратите внимание, что этот синтаксис предназначен для командной строки Windows.Для Bash используйте одинарные кавычки, чтобы процитировать скрипт.

...