我想找到一个以特定字符串开头的文件中的所有行。问题是,我事先并不知道字符串中有什么。该值存储在变量中。
天真的解决方案如下:
grep "^${my_string}" file.txt;
因为如果Bash变量my_string
包含任何正则表达式特殊字符,grep
会哭,并且每个人都会有糟糕的一天。
你不想让grep
哭,是吗?
答案 0 :(得分:5)
您应该使用awk
代替grep
进行使用index
功能的非正则表达式搜索:
awk -v s="$my_string" 'index($0, s) == 1' file
index($0, s) == 1
确保仅在开始时找到搜索字符串。
答案 1 :(得分:0)
如果Bash变量my_string
包含任何正则表达式特殊字符,是什么意思,grep
会哭
$ cat file
crying now
no cry
$ var="n.*"
$ echo "$var"
n.*
$ grep "^$var" file
no cry
现在@anubhava用勺子喂我问题(谢谢先生),使用grep
来完成这项工作似乎需要至少两个grep
s,因为你想要{{1}从字面上看,正则表达式字符在后者中使用grep
(或-F
):
fgrep
$ cat file
OMG it’s full of
*s
$ var="*"
$ grep "^.\{"${#var}"\}" file|grep -F "$var"
*s
在Bash中返回${#var}
长度,以及我们从文件开头提取的字符数量,用后者var
进行检查。
(引自2001)