Вы не сможете. PDF - это двоичный формат, поэтому вам нужно сначала преобразовать его в текст. Grep может искать в данных, но нет причин полагать, что PDF, который при открытии в программе просмотра PDF содержит строку foo
, на самом деле будет содержать foo
в исходных, двоичных данных. В исходном тексте это может быть написано совсем по-другому.
Простое решение - установить pdftotext
и использовать его. Он должен быть доступен в репозиториях вашего дистрибутива. В системах на базе Debian вы можете установить его с помощью:
sudo apt-get install poppler-utils
Затем вы можете искать в вашем PDF файле с помощью:
pdftotext foo.pdf - | grep keyword
Чтобы удалить первый элемент из $@, используйте 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
Другой вариант, если вы используете bash:
for filename in "${@:2}"
Это даст вам аргументы, начиная со второго. Это не указано в POSIX, поэтому некоторые системы могут его не поддерживать. А некоторые оболочки могут иметь ту же функциональность, но использовать другой синтаксис.
Проблема в том, что когда вы выполняете цикл (по "$@"
), параметр по-прежнему остается первым элементом списка, который вы выполняете в цикле. Вы можете удалить первый элемент $@
с помощью 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
установлена и не пуста.