Как мы egrep специальные символы, когда они из командной строки? - PullRequest
0 голосов
/ 24 января 2019

Для ясности приведу пример.

Предположим, что мы хотим написать egrep-ориентированный на технику скрипт в bash, что означает, что этот парень не знает, как избежать специальных символов, и он пропустит только то, что хочет найти.

Например, когда он хочет найти в статье вхождение это , он использует

./myEgrep it's myArticle

вместо

./myEgrep it\'s myArticle**

Как мы можем справиться с этим в сценарии? В принципе egrep нельзя дать и понять строку, содержащую специальные символы, как это делает человек. Самая сложная часть - это как обернуть $ 1 в Xgrep $ 1 $ myArticle внутри скрипта. Я попробовал fgrep, это тоже не сработает.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

' не единственная проблема. Что если пользователь введет ./myEgrep foo .* bar или ./myEgrep foo $(rm *) bar (не пытайтесь!)? Когда кто-то вызывает инструмент из оболочки , он находится в оболочке , поэтому применяются синтаксис и семантика оболочки.

Если вы хотите, чтобы они могли вызывать вашу команду с любыми аргументами, и чтобы этот вызов означал нечто иное, чем это было бы в оболочке, то вам нужно написать инструмент-обертку, который настроит для них ограниченную / не-оболочку среду работать внутри, например:

#!/bin/env bash
function myEgrep() {
    local re="$1"
    grep -E "$re" wherever
}

while IFS= read -r line; do
    cmd="${line%% *}"
    args="${line#* }"
    case $cmd in
    myEgrep ) myEgrep "$args" ;;
    esac
done

Таким образом, ваш пользователь выполняет вышеуказанный скрипт и может вводить любые команды, которые вы ему позволяете вводить, и может включать любые символы, которые ему нравятся.

0 голосов
/ 24 января 2019

Ваша проблема здесь в том, что одиночная кавычка обрабатывается оболочкой или bash, и она фактически останавливает выполнение команды, пока пользователь не введет другую одинарную кавычку. Если бы целая фраза была представлена ​​пользователем в двойных кавычках, то им не нужно было бы экранировать ни одну кавычку или пробелы, т. Е .:

./myEgrep "it's" myArticle

Я считаю, что это довольно легко объяснить пользователям, даже менее опытным.

Затем в файле скрипта вам нужно снова заключить аргумент в двойные кавычки:

Xgrep "$1" "$myArticle"

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

Конечно, тогда остается вопрос о том, как пользователь может вставлять двойные кавычки из командной строки. Для вас простой ответ - использовать одинарные кавычки для переноса двойных кавычек, но, возможно, не для них; а что если они захотят смешать кавычки?

Другой вариант будет для вас обработать ввод и преобразовать пробел в регулярное выражение для любой длины любого пробела, и одиночные кавычки в регулярное выражение для всех кавычек, включая кавычки открывать / закрывать Unicode? Опять же, легко объяснить пользователям. Любая другая схема, и вы будете изобретать escape-коды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...