Чехол с переменной $ @ Внутри

Вы не сможете. PDF - это двоичный формат, поэтому вам нужно сначала преобразовать его в текст. Grep может искать в данных, но нет причин полагать, что PDF, который при открытии в программе просмотра PDF содержит строку foo, на самом деле будет содержать foo в исходных, двоичных данных. В исходном тексте это может быть написано совсем по-другому.

Простое решение - установить pdftotext и использовать его. Он должен быть доступен в репозиториях вашего дистрибутива. В системах на базе Debian вы можете установить его с помощью:

sudo apt-get install poppler-utils

Затем вы можете искать в вашем PDF файле с помощью:

pdftotext foo.pdf - | grep keyword
0
11.12.2018, 00:07
3 ответа

Чтобы удалить первый элемент из $@, используйте shift.

#!/bin/bash
opt=$1
shift
case "$opt" in
    --header )
        for filename in "$@" ; do 
            sed -i -e '1 e cat header' "$filename"
        done
    ;;
    --footer )
        footer=~/dev/sed/footer
        for filename in "$@" ; do
            cat "$footer" >> "$filename"
        done
    ;;
esac
1
28.01.2020, 02:31

Другой вариант, если вы используете bash:

for filename in "${@:2}"

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

0
28.01.2020, 02:31

Проблема в том, что когда вы выполняете цикл (по "$@"), параметр по-прежнему остается первым элементом списка, который вы выполняете в цикле. Вы можете удалить первый элемент $@с помощью shiftперед циклом.


Я предпочитаю разделять синтаксический анализ командной строки и действия:

#!/bin/sh

unset do_header
unset do_footer

# loop until end of valid options...
while true; do
    case $1 in
        --header)   do_header=1 ;;
        --footer)   do_footer=1 ;;
        *)  # assume end of options
            break
    esac
    shift  # we have processed a valid option, shift it off the list
done

# create a temporary file that we will use multiple times
tmpfile=$(mktemp)

# remove temporary file on normal exit (in bash, also on TERM/INT)
trap 'rm -f "$tmpfile"' EXIT

# For each file, copy it to the temporary file,
# then add header and footer as requested.
# Since we clobber the original file with the redirection, 
# we won't be modifying permissions on the file.

# At this point, the valid options (any number of
# --header and --footer options) have been shifted off
# the list of arguments, so the $@ array now presumably only
# contains pathnames of files that are to be modified.

for pathname do
    cp -- "$pathname" "$tmpfile"
    cat ${do_header:+"header"} "$tmpfile" ${do_footer:+"footer"} >$pathname
done

Кроме того, это позволяет добавлять верхний и нижний колонтитулы к набору файлов одним вызовом.

Замена параметра ${var:+word}расширяется до word, если переменная varустановлена ​​и не пуста.

1
28.01.2020, 02:31

Теги

Похожие вопросы