У меня есть файл .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 и в соответствии с содержимым строки обходить все предыдущие строки.
Кто-нибудь может помочь с такой командой?
Спасибо!
Если я вас правильно понимаю, поместите в исполняемый файл следующее:
#!/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()
,
Других решений пока нет …