Я хочу найти все строки в файле, которые начинаются с определенной строки. Проблема в том, что я не знаю, что в строке заранее. Значение хранится в переменной.
Наивным решением было бы следующее:
grep "^${my_string}" file.txt;
Потому что, если переменная Bash my_string
содержит ЛЮБЫЕ специальные символы регулярного выражения, grep
будет плакать, и у всех будет плохой день.
Ты не хочешь заставить grep
плакать?
2 ответа
Вы должны использовать awk
вместо grep
для поиска без регулярных выражений с использованием функции index
:
awk -v s="$my_string" 'index($0, s) == 1' file
index($0, s) == 1
гарантирует, что строка поиска будет найдена только в начале.
Что вы подразумеваете под , если переменная Bash my_string
содержит ЛЮБЫЕ специальные символы регулярного выражения, grep
будет плакать
$ cat file
crying now
no cry
$ var="n.*"
$ echo "$var"
n.*
$ grep "^$var" file
no cry
Теперь, когда @anubhava кормила меня проблемой (спасибо, сэр), использование grep
для работы, похоже, требует по крайней мере двух grep
и, так как вы хотите grep
регулярное выражение буквально символы, используйте -F
в последнем (или fgrep
):
$ cat file
OMG it’s full of
*s
$ var="*"
$ grep "^.\{"${#var}"\}" file|grep -F "$var"
*s
${#var}
возвращает длину var
в Bash и то количество символов, которое мы извлекаем из начала файла, который будет исследован с последним grep
.
(Цитата из 2001 )
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки, синтаксического анализа и преобразования строк. Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, определяющий применимый язык программирования или инструмент.