2017-01-13 3 views
1

У меня есть большой текстовый файл, который содержит только 1 строку. Это выглядит следующим образом:Разделить одну строку с несколькими словами во множество строк с x словами на каждом

blaalibababla.ru text text text text what's the weather like tooday? blaazzabla.zu some_text blabewdwefla.au it is important not to be afraid of sed blabkrlqbla.ru wjenfkn lkwnef lkwnefl blarthrthbla.net 1234 e12edq 42wsdfg blablabla.com this should finally end 

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

blaalibababla.ru text text text text what's the weather like tooday? 
blaazzabla.zu some_text 
blabewdwefla.au it is important not to be afraid of sed 
blabkrlqbla.ru wjenfkn lkwnef lkwnefl 
blarthrthbla.net 1234 e12edq 42wsdfg 
blablabla.com this should finally end 

Я знаю, как сделать это с одним доменным именем и sed:

sed -i 's/blablabla.ru/\n&/g' file.txt 

«Но не с последующим дополнительным текстом». - Это не то, что я имею в виду.

Если sed - это не лучший способ, пожалуйста, дайте мне знать.

UPD: Вот мой текстовый файл:

wsd.qwd.qwd.kjqnwk.ru PUPPETD CRITICAL 2017-01-13 00:09:52 lor notify-by-sms FILE_AGE CRITICAL: /var/lib/puppet/state/state.yaml is 2438046 seconds old and 19459 bytes zm-goas-04.asdg.net LOAD CRITICAL 2017-01-13 00:10:32 tech-lor notify-by-telegram CRITICAL - load average: 42.91, 49.91, 53.88 glas07.kvm.ext.asdg.ru PUPPETD CRITICAL 2017-01-13 00:28:02 lor notify-by-sms FILE_AGE CRITICAL: /var/lib/puppet/state/state.yaml is 19821 seconds old and 26337 bytes  

мне это нужно выглядеть следующим образом:

wsd.qwd.qwd.kjqnwk.ru PUPPETD CRITICAL 2017-01-13 00:09:52 lor notify-by-sms FILE_AGE CRITICAL: /var/lib/puppet/state/state.yaml is 2438046 seconds old and 19459 bytes 
zm-goas-04.asdg.net LOAD CRITICAL 2017-01-13 00:10:32 tech-lor notify-by-telegram CRITICAL - load average: 42.91, 49.91, 53.88 
glas07.kvm.ext.asdg.ru PUPPETD CRITICAL 2017-01-13 00:28:02 lor notify-by-sms FILE_AGE CRITICAL: /var/lib/puppet/state/state.yaml is 19821 seconds old and 26337 bytes  
+0

Можете ли вы привести некоторые фактические данные в качестве примера? Мне любопытно, как выглядит 'some_text'. –

+0

Редактировать с помощью вашего кода –

ответ

0

Попробуйте разбить на этот шаблон: ([-a-z0-9]+\.[a-z]+){1,} для доменных имен.

С GNU СЭД:

sed -r 's/ +(([-a-z0-9]+\.[a-z]){1,}) */\n\1/g' file 

Обратите внимание, что любая строка, соответствующий одно пространство с последующим [-a-z0-9], за которым следует . и [a-z] символов будут обработаны в качестве доменного имени.

+0

sed -r 's/+ (([-a-z0-9] + \. [Az]) {1,}) */\ n \ 1/g 'файл - не работает sed -r' s/+ (([- a-z0-9] + \. [Az]) {1,}) */\ n \ 1/g 'файл - отлично работает Большое вам спасибо за помощь! –

+0

Рад помочь. Пожалуйста, взгляните на [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – SLePort

+0

Не могли бы вы изменить в своем ответе из этой строки: sed -r/+ (([- a-z0-9] + \. [az]) {1,}) */\ n \ 1/g 'файл следующим образом: sed -r' s/+ (([- a-z0-9] + \. [az]) {1,}) */\ n \ 1/g 'файл ? –

5

постоянно более простым способом, используя xargs обрабатывать n записи в то время, которое в ваш случай только 2

xargs -n2 <file 
blablabla.ru some_text 
blablabla.zu some_text 
blablabla.au some_text 
blablabla.ru some_text 
blablabla.net some_text 
blablabla.com some_text 

где -n флаг согласно man xargs странице,

-n max-args, --max-args=max-args 
     Use at most max-args arguments per command line. Fewer than max-args arguments 
     will be used if the size (see the -s option) is exceeded, unless the 
     -x option is given, in which case xargs will exit. 

Чтобы заменить обратно оригинальный файл, сделайте

xargs -n2 <file >tmpfile; mv tmpfile file 
+1

@JamesBrown: Yup :), последние 4k пошли в jiffy – Inian

+0

Отличный ответ @Inian! Я работал над чем-то, и мне просто нужен этот «xargs -n». – codeforester

+1

Да, я поддержал вас и, похоже, послал вас наверху! Поздравляю. – codeforester

2

Awk:

$ awk 'gsub(/([^ ]+){2}/,"&\n")' file 
blablabla.ru some_text 
blablabla.zu some_text 
blablabla.au some_text 
blablabla.ru some_text 
blablabla.net some_text 
blablabla.com some_text 

Разъяснение:

Заменяет каждый дважды повторяющийся [^ ]+ (строка o f пробелы и пространство) с самим собой (&) и новой линией \n. Если в конце есть оставшийся (то есть не совпадение), он не будет напечатан (если вы не обернете gsub(...){}1).