изменить вывод файла gettext .pot, чтобы исключить пустые строки или строки, содержащие только пробелы

0

У меня есть файл.pot, созданный xgettext в исходном коде c++ в формате:

#: file1.cpp:line
#: file2.cpp:line
msgid "" - empty string

#: file1.cpp:line
#: file2.cpp:line
msgid " \t\n\r" - string contains only spaces

#: file1.cpp:line
#: file2.cpp:line
msgid "real text"

Затем я использую команду:

grep "#: " "$(POT_FILE)" | sed -e 's/^\(#: \)\(.*)/\2'

чтобы в выходных файлах были только имена файлов и строки.

Но дело в том, что мне не нужны файлы для строк, содержащих только пробелы.

Это довольно сложно, потому что мне нужно найти строку msgid "" или такую как раз рядом с последовательностью строк #: blablabla и в соответствии с содержимым строки обходить все предыдущие строки.

Может ли кто-нибудь помочь с такой командой?

Благодарю!

  • 0
    Я думаю, что выражение sed должно быть sed -e 's/^\(#: \)\(.*\)/\2/' , там было два пропущенных слеша. Кроме того, каков ваш желаемый результат?
  • 0
    Почему вы не правильно комментируете строки в первую очередь?
Показать ещё 2 комментария
Теги:
grep
awk

1 ответ

0

Если вы правильно поняли, добавьте следующее в исполняемый файл:

#!/usr/bin/awk -f

BEGIN { FS="\"" } # make it easier to test the text for msgid

# clean "file:line" line and store it in an array called "a"
/^#: / { sub(/^#: /, "", $0); a[i++]=$0 }

/^msgid/ {
    if( valid_msgid() ) { for( j in a ) print a[j] }
    reset() # clear array a after every msgid encountered
    }

function reset() {
    for( j in a ) { delete a[j]  }
    i = 0
    }

# put your validity tests here.
# $2 won't contain the entire string if the gettext contains double quotes
function valid_msgid() {
    if( length($2) > 0 && $2 !~ /^ / ) return 1
    return 0
    }

Если я поставил вышеуказанное в файл awko и chmod +x awko тогда запустите awko data.pot Я получаю следующее:

#: file1.cpp:line
#: file2.cpp:line

который соответствует вашему последнему разделу, если вы преобразуете значения "линии" в числа.

Один из трюков использует " как разделитель. Если вам нужно отклонить строки, где хранится msgid ", вам придется использовать более сложный синтаксический анализ, чтобы идентифицировать полный текст сообщения.

У меня нет доступа к xgettext, поэтому я не знаю, есть ли комментарии после - в примере неправильные строки от вас или программы. Программа xgettext выводит их, разделитель может быть изменен на " - чтобы проверить эти строки в valid_msgid().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню