Почему grep не может сопоставить строки "-n" и "-e" в bash? - PullRequest
2 голосов
/ 07 марта 2019

Короче говоря, моя проблема сузилась до одной строки:

for a in {a..z}; do echo "-$a" | grep "\-$a"; done

Это печатает все буквы , но -e и -n,

Похоже, версия для Linux, версия bash, флаги для grep (-P, -E) и т. Д. Не имеют значения!
Протестированные среды:

  1. GNU bash, версия3.2.57 (2) -релиз (x86_64-suse-linux-gnu) на SUSE Linux Enterprise Server 11 SP4
  2. GNU bash, версия 4.4.12 (3) -релиз (x86_64)-unknown-cygwin) on Cygwin (base-cygwin 3.8-1; cygwin32 2.10.0-1)
  3. rextester (онлайн-компилятор bash; GNU bash 4.3.46)

Почему не печатаются -e и -n?
(Удаление штрихов в коде также устраняет проблему)

1 Ответ

7 голосов
/ 07 марта 2019

Проблема в том, что -e, -n являются действительными echo параметрами и echo не печатает их.

Кроме того, вы должны использовать -- в grep, чтобы отделить параметры и шаблон. Рекомендуется использовать опцию -F в grep, а также для поиска по фиксированным строкам.

Вы можете использовать:

for a in {a..z}; do grep -F -- "-$a" <<< "-$a"; done

-a
-b
-c
-d
-e
-f
-g
-h
-i
-j
-k
-l
-m
-n
-o
-p
-q
-r
-s
-t
-u
-v
-w
-x
-y
-z

Обратите внимание, что вы также можете использовать printf вместо echo:

for a in {a..z}; do printf -- '-%s\n' "$a" | grep -F -- "-$a"; done
...