Греп – ^ (\ s * $) vs ^ \ s * $

Я хочу найти поле, в котором есть только пробелы. Считая, что эти две команды дали мне разные результаты:

grep "^\s*$" -E -c grep "^(\s*$)" -E -c 

Еще одна вещь. Каков правильный способ сказать «пространства только или что-то другое»:

 grep "^(\s*$|STRING)" -E -c 

или

 grep "(^\s*$|^STRING)" -E -c 

Или они эквивалентны?

  • Вставка переменных в команду в сценарии оболочки
  • Вопрос о shell и .profile, .bash_profile, .bashrc
  • удалить строки, где значение поля меньше или равно 3 - sed или awk?
  • Sh Script с использованием ftp для размещения списка файлов
  • Можно ли использовать утилиту Rename для упрощения этого скрипта, который использует Find и Mv?
  • Bash: Почему считывается, возвращая ненулевой статус выхода во время чтения моего файла?
  • Как вы получаете первый файл в каждом подкаталоге, соответствующем списку расширений файлов?
  • Пуленепробиваемый метод для работы с повторяющимися тиражами
  • One Solution collect form web for “Греп – ^ (\ s * $) vs ^ \ s * $”

    Обычный grep не понимает \s или круглые скобки. (*) Вы хотите, чтобы grep -P доступен, или grep -E / egrep и write \s out как [ ^I] (где ^ITab , grep без -P doesn Не понимаю. Кроме того, с двойными кавычками некоторые оболочки будут обрабатывать \s и оставлять только s ; вы всегда должны использовать одинарные кавычки с регулярными выражениями из оболочки, за исключением случаев, когда вам действительно нужно интерполировать переменную (например, что-то вроде '^\s*'"$foo"'\s+\(' , переключение цитирования в среднем параметре) ,

    Альтернативы в вашем втором примере (опять же, с -P и одинарным цитированием вместо double) делают то же самое. Первое технически лучше, потому что grep не будет отступать так же сильно, но практически это не имеет значения.

    (*) педантизм: спин-шрамы-парсеры будут работать, снова требуя одинарного цитирования, чтобы оболочка не ест обратную косую черту. egrep обычно проще.

    Linux и Unix - лучшая ОС в мире.