У меня есть файл.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()
.
sed
должно бытьsed -e 's/^\(#: \)\(.*\)/\2/'
, там было два пропущенных слеша. Кроме того, каков ваш желаемый результат?