В моем случае работают оба приведенных ниже регулярных выражения.
grep \s
grep ^[[:space:]]
Однако все нижеприведенные терпят неудачу. Я пробовал как в git bash, так и в шпатлевке.
grep ^\s
grep ^\s*
grep -E ^\s
grep -P ^\s
grep ^[\s]
grep ^(\s)
Последний даже дает синтаксическую ошибку.
Если я попробую ^\s в debuggex, он заработает.

Как найти строки, начинающиеся с пробелов с помощью grep? Могу ли я использовать имеют для использования [[:space:]]?
Ты прав ! с \\s работает! Но я не понимаю, почему ... Что ж, если вы скажете это как ответ, я приму это.
Вы всегда должны цитировать каждый аргумент каждой команды, если у вас нет конкретной причины не понимать и полностью понимать все последствия. Цитируйте с использованием ' по умолчанию, затем ", если необходимо (например, чтобы позволить переменной оболочки расширяться) и, наконец, без кавычек, если это абсолютно необходимо (например, чтобы разрешить разделение слов, подстановку глобусов и расширение имени файла).
Возможный дубликат Регулярное выражение Bash - не может соответствовать \ s, \ S и т. д.





grep \s работает для вас, потому что ваш ввод содержит s. Здесь вы экранируете s, и он соответствует s, поскольку он не анализируется как escape-последовательность регулярного выражения, совпадающую с пробелами. Если вы используете grep ^\\s, вы найдете строку, начинающуюся с пробела, поскольку \\ будет анализироваться как буквальный \ char.
Лучше включить синтаксис POSIX ERE с -E и процитировать шаблон:
grep -E '^\s' <<< "$s"
См. онлайн-демонстрация:
s=' word'
grep ^\\s <<< "$s"
# => word
grep -E '^\s' <<< "$s"
# => word
\s - это PRCE, а не ERE. Он поддерживается GNU grep, но большинство других реализаций grep интерпретируют \s как s.
@ Кусалананда Я знаю, я имел в виду GNU grep. Я тестирую только с GNU grep, я пользователь Ubuntu. Другие реализации слишком глючны по сравнению с тем, что я видел больше года здесь, на SO.
Мне даже флаг не нужен, он работает с grep '^\s'
@NicolasSeiller Верно, но это просто для удобства. Если вы используете + или {}, вам не придется их избегать.
\s не имеет ничего общего с ERE или BRE - он будет работать как сокращение для [[:space:]] в любом варианте регулярного выражения, если ваша версия grep (или другого инструмента) поддерживает это сокращение, а если нет, то не будет.
Вы вообще используете цитаты? Без цитирования bash "съест" побег из
\s, и вам понадобится второйgrep ^\\s ....