Как grep двойные кавычки содержат обратную косую черту в одинарных кавычках в файле?

Сzsh:

#! /bin/zsh -

typeset -Z3 page
files=(image-<0-3900>.jpg)
for ((page = 1; $#files; page++)) {
  convert $files[1,13] -append./Merged/page_$page.jpg
  files[1,13]=()
}

Обратите внимание, что поскольку имеется 3901 изображение (13 × 300 + 1 ), на последней странице будет только одно изображение.

Вы можете сделать что-то подобное с bash, например:

#! /bin/bash -
shopt -s extglob
shopt -s failglob
set -- image-+([[:digit:]]).jpg
for ((page = 1; $#; page++)) {
  printf -v padded_page %03d "$page"
  convert "${@:1:13}" -append "./Merged/page_$padded_page.jpg"
  (($# > 13)) || break
  shift 13
}

POSIXly, при условии, что есть совпадающие файлы и еще менее тщательная проверка имен файлов:

#! /bin/sh -
set -- image-*.jpg

# disable split+glob, only retain empty removal on unquoted expansions:
set -o noglob; IFS=

page=1; while [ "$#" -gt 0 ]; do
  padded_page=000$page
  padded_page=${padded_page#"${padded_page%???}"}
  convert $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} \
    -append "./Merged/page_$padded_page.jpg"
  [ "$#" -gt 13 ] || break
  shift 13
  page=$((page + 1))
done

Обратите внимание, что хотя здесь имена файлов очень простые (без пробелов, специальных символов... ), в этих кодах особое внимание уделено обработке произвольных символов. Однако обратите внимание, что convertи другие утилиты imagemagick могут иметь проблемы с именами файлов, начинающимися с -(, даже при использовании--)или содержащих :, поэтому лучше всего добавлять к путям файлов префикс ./, чтобы избежать этих проблем (. ] например, используйте ./*.jpgвместо*.jpg).

1
14.05.2020, 08:55
1 ответ

Используйте параметр -F(для фиксированного -поиска строки , ранее выполнявшегося с помощью утилиты fgrep):

grep -F "u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'" file

Символы .и \являются операторами регулярных выражений, один из которых соответствует любому одиночному символу, а другой используется для экранирования операторов регулярных выражений или введения новых (перед x] однако поведение не определено POSIX и может варьироваться в зависимости от реализации ).

Таким образом, без -Fвам пришлось бы убегать от обоих.

Поскольку в Bourne -, как и оболочки или fish, внутри "...", \также есть особое значение экранирования для оболочки, вам также потребуется еще один раунд экранирования для нее:

grep "u2py\.DynArray value=b'F\\\\xfeVOC\\\\xfeD_VOC'" file

В csh или tcsh это будет:

grep "u2py\.DynArray value=b'F\\xfeVOC\\xfeD_VOC'" file

Оболочка rcи производные не поддерживают "..."в качестве оператора кавычек. Вам нужно будет использовать одинарные кавычки:

grep 'u2py\.DynArray value=b''F\\xfeVOC\\xfeD_VOC''' file

(одинарные кавычки обозначаются как ''внутри одинарных кавычек. См. Как использовать специальный символ как обычный? для получения дополнительной информации ).

1
28.04.2021, 23:14

Теги

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