2016-03-14 3 views
-1

входного файла: Имя файла = 'sample1.txt'множественным имя соответствует шаблону

  1. лев является хорошим другом (Host = лев) (Порт = животное) и тигр (Host = Tiger) (Port = а)

  2. гамбургер питание (Host = Burger) (Port = Food)

у меня есть данные, как показано выше TXT file.i хотят собрать час ост и порт в каждой строке из текстового файла и поместить их в новый текстовый файл

Обязательный Outfile:

  • лев: животное
  • Tiger:
  • Burger: Продукты

Код, использованный до nw:

cat sample1.txt | perl -ne 'print "$1=$2\n" if(/Host=([\w.]*.'-'*[\w.]*.).*Port=(\d+)/)' > sample2.txt 

sed 's|[()]||g' sample2.txt > sample3.txt 

Полученные результаты:

  • лев: животное
  • Burger: Продукты

Не получает Тигр и:

Проблемы: Я нахожусь не удалось получить хост и порт в ту же строку, которая присутствует более одного раза .. В некоторой строке у нее есть только один номер хоста и порта. В другой строке есть более одного значения хоста и порта. pls помогают мне перенести это .. спасибо ..:)

+0

'Perl -ne«Host = (\ W +) * Порт = (\ W +)/g && print "$ 1 = $ 2 \ n"; ''- на основе ваших данных образца. Полезный трюк - вы можете сравниться с отрицательным, если хотите «все до скобки» как «[^)] +' например. – Sobrique

ответ

0

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

perl -nle 's{Host=([^)]*).*?Port=([^)]*)}{print "$1:$2"}ge' <sample1.txt> sample3.txt 
+0

Отличный ответ .. спасибо очень .. :) .. он работает ... –

+0

Почему вы используете больше, чем 'ge' в коде .... и ^ означает начало строки, что делает [^)] означает ..thanks –

+0

В начале символьного класса '^' означает отрицание. Поэтому '[^)]' означает любой символ, кроме ')'. – mik

Смежные вопросы