Как отфильтровать файл PO по ссылке?

Мне нужно отфильтровать из PO-файла все записи, которые используются только в админке wordpress (чтобы я мог переводить только строки, обращенные к пользователю). Другими словами, если все ссылки на любую данную запись содержат строку "../admin" (т.е. начинаются с "#: ../admin"), я не хочу, чтобы они были в выходном файле.

Инструменты могут быть grep, sed, windows, что угодно. Любые идеи?

(Приветствуются идеи о других способах достижения этой цели, но я подумываю отфильтровать строки, обращенные к пользователю, для перевода, а затем поместить только те строки в PO-файл. Родным языком является английский, и я могу оставить весь контент, доступный администратору, на английском языке.)

Отфильтруйте это:


#: ../admin/add_new_packet.php:64
#: ../admin_processing/add_new_packet_processing.php:9
msgid "Cancel"
msgstr ""

Оставьте это в:


#: ../header-employer.php:81
#: ../admin/add_new_packet.php:64
msgid "Logout"
msgstr ""

Вот формат PO-файлов для тех, кто незнакомый.


person Gaia    schedule 16.07.2012    source источник
comment
комментарии о том, как улучшить вопрос, также приветствуются.   -  person Gaia    schedule 17.07.2012
comment
Я бы предложил добавить пример ввода и желаемый результат (и описать, что вы пробовали до сих пор, если что).   -  person Lev Levitsky    schedule 17.07.2012
comment
Файлы PO имеют стандартный формат. Желаемый результат — тот же формат без записей, которые имеют ссылки, указывающие, что они используются исключительно на стороне администратора. Если вы не знакомы с форматом, посмотрите gnu. org/software/gettext/manual/html_node/PO-Files.html   -  person Gaia    schedule 17.07.2012
comment
Ссылка на описание формата — это не то же самое, что показ образца ввода. Предоставление образцов входных и выходных данных помогает другим писать, тестировать и иллюстрировать ответы, даже если ваш вопрос и без этого достаточно ясен. Я рекомендую включать примеры везде, где это возможно. (Я удалил отрицательный голос, поскольку вы some приложили усилия для улучшения вопроса. Тем не менее, я думаю, что вы можете/должны улучшить его дальше)   -  person Lev Levitsky    schedule 17.07.2012


Ответы (1)


Одно решение с использованием awk. Содержание script.awk:

BEGIN {
    ## Separate records by one or more blank lines.
    RS = ""

    ## Each line will be one field. Both for input and output.
    FS = OFS = "\n"
}

## For every paragraph...
{
    ## Flag: If 0, print current record of PO file. If 1, don't
    ## print it.
    admin = 0 

    ## Traverse all lines of each record. If matches '#: ../admin'
    ## set flag and end processing.
    for (i = 1; i <= NF; i++ ) { 
        if ( $i ~ /^#: *\.\.\/admin\/?/ ) { 
            admin = 1 
            break
        }   
    }   

    ## Print only if flag hasn't been set.
    if ( ! admin ) { 
        print $0 "\n"
    }   
}

Вы не предоставили ни ввод, ни вывод, как предложил Лев Левицкий в комментариях, так что непросто догадаться, как должен вести себя скрипт, чтобы получить решение и протестировать его, чтобы убедиться, что он работает.

person Birei    schedule 16.07.2012