Извлечь результат соответствия строк из текстового файла - PullRequest
0 голосов
/ 14 декабря 2011

Мне нужно извлечь имя файла из текстового файла, тогда как выходные данные в текстовом файле не имеют шрифтов.

Так что, как вы можете видеть из выходного файла ниже, мне нужно распечатать результаты, где онинет шрифтов после первых результатов?Таким образом, только последний результат имеет шрифты в этом выводе

Имеет ли это смысл - будет ли Grep, Sed или Awk ответом

Поэтому нужен вывод из текстового файла ниже, который показывает, что шрифтов нетприсутствуют в этом PDf в пределах ** START и ** END

******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp1.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp2.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
BAAAAA+TimesNewRomanPS-BoldMT        TrueType          yes yes yes     14  0
CAAAAA+TimesNewRomanPSMT             TrueType          yes yes yes      9  0
/home/user3/Documents/temp file.pdf
******************END***********************

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Это может работать для вас:

sed -n '/^\*/,//{H;/\*END\*/{x;s/\n/&/6;t;s|[^/]*\([^\n]*\).*|\1|p}}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf

Объяснение:

  1. Сосредоточиться на линиях между строками, начинающимися с *
  2. Хранить такие строки вудержание пробела (HS).
  3. Когда мы дойдем до конечного свопа с разделителем на HS.
  4. Проверьте наличие 6 или более символов новой строки, т. е. записей, которые должны иметь шрифты, и, если это так, спасение.
  5. Удалите весь несущественный текст и распечатайте.

Или в крайнем случае:

sed -n '/^\*/,//{H;/\*END\*/{x;s|[^/]*-\n\(/[^\n]*\).*|\1|p}}' in.txt
1 голос
/ 14 декабря 2011

Печатается любая строка, содержащая «.pdf», если предыдущая строка начинается с -.

[me@home]$ awk '{if (st && match($0,".pdf")){print $0}; st=match($0,"^-")}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf

Это не общее решение, но оно будет работать с введенными вами входными данными.Я могу представить несколько крайних случаев, когда это может не сработать, но все зависит от спецификаций вашего входного файла.


Обновление

(на основе сценария, который вы разместили в комментарияхниже) Если то, что вы пытаетесь сделать, это просто определить PDF-файлы, которые не имеют встроенных шрифтов, это может сработать:

MAGNUM="/mnt/network/User\ 1\ PDF\ 06.12.11/"
has_no_fonts() {
    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l)
    exit $(( $COUNT - 4 ))
}
export -f has_no_fonts
find "$MAGNUM" -type f -name "*.pdf" -exec bash -c 'has_no_fonts "{}"' \; -print

Вот разбивка сценария:

  • Определение количества встроенных шрифтов.Было бы просто, если бы pdffonts вернул конкретное значение, если бы не было встроенных шрифтов, но это не так.Поэтому мы подсчитываем количество выходных строк и вычитаем 2 (строки заголовка), чтобы определить количество встроенных шрифтов

    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l) # number of output lines
                                                # exactly 2 if no fonts
                                                # exactly 0 if there are errors
    exit $(( $COUNT - 2 ))  # exit 0 (success) if and only if PDF has no fonts
    
  • экспортированная функция bash, чтобы ее можно было использовать в подоболочке.

    export -f has_no_fonts
    
  • Найдите файлы PDF и распечатайте имя только в том случае, если PDF допустим и не содержит шрифтов

    find .....  -exec bash -c 'has_no_fonts "{}"' \; -print
                      -------                        -------
                          |                             |
              -exec cannot run bash functions     Will only print 
               so run in a bash subshell       filename if prev command exit with 0
    

Если вы предпочитаете однострочноеВесь сценарий можно записать так:

find "$MAGNUM" -name "*.pdf" \
    -exec bash -c 'exit $(($(pdffonts "{}" 2> /dev/null |wc -l) - 2))' \; -print
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...