Я хочу найти все строки в файле, которые начинаются с определенной строки. Проблема в том, что я не знаю, что в строке заранее. Значение хранится в переменной.

Наивным решением было бы следующее:

grep "^${my_string}" file.txt;

Потому что, если переменная Bash my_string содержит ЛЮБЫЕ специальные символы регулярного выражения, grep будет плакать, и у всех будет плохой день.

Ты не хочешь заставить grep плакать?

6
Jonathan Matthews 24 Апр 2017 в 07:26

2 ответа

Лучший ответ

Вы должны использовать awk вместо grep для поиска без регулярных выражений с использованием функции index:

awk -v s="$my_string" 'index($0, s) == 1' file

index($0, s) == 1 гарантирует, что строка поиска будет найдена только в начале.

5
anubhava 24 Апр 2017 в 04:37

Что вы подразумеваете под , если переменная 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 )

0
James Brown 24 Апр 2017 в 08:26
43579802