Выход метасимволов в основном/расширенном posix regex представляет в виде строки в grep

Аргумент в arg0, но это - адрес пространства пользователя вызывающей стороны, а не фактическая строка. Необходимо перенести его с a copyinstr() также:

dtrace -n 'syscall::chmod:entry { printf("%d %s", uid, copyinstr(arg0)); }'
6
23.05.2017, 15:40
1 ответ

Как заключить специальные символы в кавычки (портативно)

Следующий отрывок добавляет обратную косую черту перед каждым символом, который это является особенным в расширенных регулярных выражениях, с помощью sed заменять любое происшествие одного из символов ][()\.^$?*+ обратной косой чертой, сопровождаемой тем символом:

raw_string='test[string]\.wibble'
quoted_string=$(printf %s "$raw_string" | sed 's/[][()\.^$?*+]/\\&/g')

Это удалит запаздывание новых строк в $raw_string; если это - проблема, удостоверьтесь, что строка не заканчивается новой строкой путем добавления инертного символа в конце, то снимите изоляцию с того символа.

quoted_string=$(printf %sa "$raw_string" | sed 's/[][()\.^$?*+]/\\&/g')
quoted_string=${quoted_string%?}

Как заключить специальные символы в кавычки (в ударе или zsh)

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

quoted_string=${raw_string//\\//\\\\}
for c in \[ \] \( \) \. \^ \$ \? \* \+; do
  quoted_string=${quoted_string//"$c"/"\\$c"}
done

Как заключить специальные символы в кавычки (в ksh93)

Строковая заменяющая конструкция Ksh более мощна, чем вниз политая версия в ударе и zsh. Это поддерживает ссылки на группы в шаблоне.

quoted_string=${raw_string//@([][()\.^$?*+])/\\\1}

Что Вы на самом деле хотите

Вам не нужно find здесь: шаблоны оболочки достаточны для соответствия файлам, заканчивающимся тремя цифрами. Если никакой файл части не существует, шаблон шарика оставляют нерасширенным. Существует также более простой способ добавить размеры файла: вместо того, чтобы использовать stat (который существует на многих вариантах Unix, но имеет другой синтаксис на каждом), и сделайте конвейерную обработку комплекса для подведения итогов значений, можно звонить wc -c (на регулярных файлах, в большинстве систем, wc посмотрит на размер файла и не потрудится открывать файл и читать байты).

set -- "$DESTINATION/$FILE_BASENAME".[0-9][0-9][0-9]
case $1 in
  *\]) # The glob was left intact, so no part exists
    do_split …;;
  *) # The glob was expanded, so at least one part exists
    FILE_SIZE_EXISTING=$(wc -c "$@" | sed -n '$s/[^0-9]//gp')
    if [ "$FILE_SIZE_EXISTING" -ne "$(wc -c <"$DESTINATION/$FILE_BASENAME")" ]; then
      do_split …
    fi

Обратите внимание, что Ваш тест на общем размере не очень надежен: если файл изменился, но остался тем же размером, Вы закончите с устаревшими частями. Это в порядке, если файлы никогда не изменяются, и единственный риск состоит в том, что части могут быть усеченными или недостающими.

7
27.01.2020, 20:27
  • 1
    Спасибо за большое объяснение :) Я не знал о wc -c –  mg007 25.02.2012, 12:26
  • 2
    я прочитал некоторые статьи о получении размера файла, который использовал stat, но мне не сказали о его дефицитах :( –  mg007 25.02.2012, 12:33
  • 3
    Первое решение не выходит из наклонных черт вправо. Следующая строка работала на мой вариант использования: sed 's/[][()\.^$\/?*+]/\\&/g' –  jtpereyda 26.09.2014, 04:58

Теги

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