LINUX.ORG.RU

Форматировать вывод

 ,


0

2

Привет, ЛОР! Помоги! Есть входной поток из файла типа:

#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:4
msgid "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;"
msgstr "Карта;Микрофон;Громкость;Затухание;Баланс;Bluetooth;Наушники;"
--
#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:4
msgid "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen Reader;text;font;size;AccessX;Sticky Keys;Slow Keys;Bounce Keys;Mouse Keys;"
msgstr "Клавиатура;Мышь;a11y;Специальные возможности;Контрастность;Масштаб;Чтение с экрана;текст;шрифт;размер;AccessX;залипающие клавиши;медленные клавиши;отскакивающие клавиши;клавиши мыши"
--
#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:4
msgid "Login;Name;Fingerprint;Avatar;Logo;Face;Password;"
msgstr "Вход;Имя;Отпечаток;Аватар;Логотип;Лицо;Пароль;"
--
#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:4
msgid "Tablet;Wacom;Stylus;Eraser;Mouse;"
msgstr "Планшет;Wacom;Перо;Ластик;Мышь;"
нужно привести к виду
gnome-sound-panel.desktop Карта;Микрофон;Громкость;Затухание;Баланс;Bluetooth;Наушники;
gnome-universal-access-panel.desktop Клавиатура;Мышь;a11y;Специальные возможности;Контрастность;Масштаб;Чтение с экрана;текст;шрифт;размер;AccessX;залипающие клавиши;медленные клавиши;отскакивающие клавиши;клавиши мыши
gnome-user-accounts-panel.desktop Вход;Имя;Отпечаток;Аватар;Логотип;Лицо;Пароль;
gnome-wacom-panel.desktop Планшет;Wacom;Перо;Ластик;Мышь;
Понятно что с помощью sed, видимо.



Последнее исправление: Pupizoid (всего исправлений: 1)
while read line; do
 if `echo "$line" | grep -q 'in.in.h:4'`; then
  who="`basename \"$line\" '.in.in.h:4'`"
  echo -n "$who"
 fi
 if `echo "$line" | grep -q 'msgstr'`; then
  msgstr="$line"
  echo "$line" | tr -d 'msgstr' | tr -d \"
 fi
done < list

в list исходник.

uspen ★★★★★
()
Ответ на: комментарий от uspen

tr -d 'msgstr'

А вот это уже нехорошая подстава, посему таки добавлю:

awk -F'[/"]' '/^#: / {sub(".in.in.h:4",""); desktop=$NF} /^msgstr/ {print desktop, $2}'

// надежнее . экранировать в sub

anonymous
()

Не посчитайте за наглость, но не могу я сам это разобрать. В общем: данные беру из файла, интересует строка msgstr с привязкой к .desktop-файлу. В первом сообщении описан тривиальный способ, когда записи приведены к виду:

#: ../бла_бла.desktop.in.in.h:4
msgid "бла_бла"
msgstr "бла_бла"
я его грепал по .desktop.in.in.h:4 с показом следующих 2 строк и получал поток как в первом сообщении. НО! теперь попадаются файлы, где нету .desktop.in.in.h:4, а есть с изменением от 1 до 5 в последнем символе, и, самое фиговое, что после этой строки может идти неизвестное количество строк до вожделенного msgstr, поэтому моя «гениальная» схема выборки и способы, предложенные уважаемым uspen не работают. Вот пример такого файла:
::~::->> cat test/gnome-games-3.4.1/po/ru.po | grep -A 10 .desktop.in.in.h
#: ../quadrapassel/data/quadrapassel.desktop.in.in.h:2
msgid "Fit falling blocks together"
msgstr "Укладывайте падающие блоки вместе"

#: ../quadrapassel/src/game-view.vala:332
msgid "Game Over"
msgstr "Игра окончена"

#: ../quadrapassel/src/quadrapassel.vala:183
msgid "Lines:"
msgstr "Линии:"
--
#: ../swell-foop/data/swell-foop.desktop.in.in.h:1
#: ../swell-foop/data/preferences.ui.h:1
#: ../swell-foop/src/swell-foop.vala:65
#: ../swell-foop/src/swell-foop.vala:377
#: ../swell-foop/src/swell-foop.vala:382
#: ../swell-foop/src/swell-foop.vala:441
msgid "Swell Foop"
msgstr "Swell Foop"

#: ../swell-foop/data/swell-foop.desktop.in.in.h:2
msgid "Clear the screen by removing groups of colored and shaped tiles"
msgstr "Очистите поле, удаляя группы цветных шаров"

#: ../swell-foop/data/preferences.ui.h:2
msgid "Board size:"
msgstr "Размер доски:"

#: ../swell-foop/data/preferences.ui.h:3
msgid "Number of colors:"
msgstr "Число цветов:"
Как видно в вывод попадают «левые» msgstr, которые мне не нужны, а в некоторых блоках присутствуют «лишние» строки между desktop и msgstr, что делает способ анонимуса неработающим. Собсственно вопроса остается прежним: как из изменившегося входного потока получить выход, как в первом сообщении?

Pupizoid
() автор топика
Ответ на: комментарий от Pupizoid

тебе же некто anonymous написал хороший вариант с awk-ом, исправил бы его, множественные вызовы grep не хорошая идея...

awk -F'[/"]' '/^#: .*desktop/ {sub(".in.in.h:.*",""); desktop[k++]=$NF} /^msgstr/ {for(i=0;i<k;i++)print desktop[i], $2;k=0}'

anonymous
()
Ответ на: комментарий от anonymous

ООО! Гранд мерси, я c AWK в напряженных отношениях!

Pupizoid
() автор топика
Ответ на: комментарий от anonymous

А ещё можно отвечать на оригинальный вопрос и использовать sed

sed -n '
# Берем линии начинающиеся с #
/^#/ { 
  # Удаляем путь и .in из имени файла
  s|^.*/||; s|\.in\.in\.h:4.*$||;
  # Сохраняем имя файла в hold space и считваем строку с переводом
  h; n; n;
  # Обрезаем текст до и после кавычек
  s|^[^"]*"||; s|".*$||;
  # Добавляем строку к сохранённой в hold space, 
  # возвращаем обе в pattern space 
  H; g;
  # и заменяем перевод строки на пробел
  s|\n| |p;
}'
kim-roader ★★
()
Ответ на: комментарий от kim-roader

Или кратко

 sed -n '/^#/{s|^.*/||;s|\.in\.in\.h:4.*$||;h;n;n;s|^[^"]*"||;s|".*$||;H;g;s|\n| |p;}'

kim-roader ★★
()
Ответ на: комментарий от Pupizoid
sed -n '/^.*desktop/ {s|^.*/||;s|\.in\.in\.h.*$||;h;:l;n;s/^msgstr[^"]*"//;Tl;s/".*$//;H;g;s/\n/ /p}'
kim-roader ★★
()
Ответ на: комментарий от kim-roader

Это, разумеется, плюс. Но что (в данном конкретном случае) строчка для sed в голове оформится быстрее - я отчего-то сомневаюсь.

anonymous
()

Добавлю свои 5 копеек)

#!/usr/bin/env perl
use strict;
use warnings;

while(<>)
{
  chomp;
  if(/^\#.*\/([^\/]+\.desktop)\.in\./)
  {
    print $1;
  }
  elsif(/^msgstr\s+\"(.*)\"/)
  {
    print " " . $1 . "\n";
  }
}
0;

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от kim-roader

Ну perl не мой основной язык программирования. Хотя вот одни товарищи тут собрались мне джоб оффер делать на перл девла, если пойду к ним обещаю исправиться =)

DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.