教一个grep搜索中的的单引号转义问题。

时间:2021-11-16 23:16:31
 

[root@testserver juhuaxia]# more a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
 


[root@testserver juhuaxia]#grep -n "\"" a
2:"b

[root@testserver juhuaxia]#grep -n "\'" a
1:bbq 123a
2:"b
3:'c
4:bcdb
5:efgh
6:5555
7:h
8:i
9:j
10:k
11:lnnl
12:



为什么'没法转义?
另外,在grep里面,正则表达式用双引号括起来与用单引号括起来,有啥区别啊? 

还有个小疑问:

ababab  这种正则怎么写啊。
grep '^ba$\{1\}|' 文件名,这么写的意思究竟是ba重复一次,还是$符号重复一次呢。

6 个解决方案

#1


为什么要转义呢?又不是特殊字符。
$ cat a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
$ grep -n "\"" a
2:"b
$ grep -n "'" a
3:'c

#2


引用楼主 o06v90o 的回复:
 
  
[root@testserver juhuaxia]# more a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
 
  

[root@testserver juhuaxia]#grep -n "\"" a
2:"b

[root@testserver ……

单引号和双引号我是这么认为的。单引号里面可以包含过滤双引号的正则表达式,双引号里面可以包含过滤单引号的正则表达式。单引号不能变量替换,双引号可以。看下面的例子。
$ var=lnnl
$ grep -n "$var" a
11:lnnl
$ grep -n '$var' a
# 没有任何结果


ababab这种正则很好写啊。
grep "\(ab\)\{3\}"
如果用扩展正则表达式的话,可以把那几个转义符去掉了。
grep "(ab){3}"

#3


引用 1 楼 linwhwylb 的回复:
为什么要转义呢?又不是特殊字符。

Python code

$ cat a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
$ grep -n "\"" a
2:"b
$ grep -n "'" a
3:'c


为什么 grep -n "'" a 不能用 grep -n "/'" a呢?
单引号不是特殊符合?

#4


关键问题在于,使用grep的时候,转义字符有两套,一套属于linux系统,叫系统保留字,一套属于正则表达式,叫转义字符……
单引号和双引号的问题,只对系统保留字起作用,对正则的转义字符不起作用……
也就是说,在使用grep的时候,你输入的字符(无论是单引号还是双引号),都先要经过bash的分析和转义,这个时候单引号不做分析,双引号按照系统保留字进行分析,然后将分析的结果交给grep,grep利用正则表达式对字符串进行再分析,从而得到最终结果……
所以,对于grep转义的问题,LZ必须得清楚你要转义的字符究竟是按照系统保留字还是按照正则的转义字符来进行,因为系统保留字和正则转义字符有一些是共用的……

#5


楼上的大哥,能给我讲下
grep "\'" a

为啥他返回整个a文件的内容吗

#6


已经找到方法:

grep "\'" a
相当于
grep "" a
相当于
grep \^ a

#1


为什么要转义呢?又不是特殊字符。
$ cat a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
$ grep -n "\"" a
2:"b
$ grep -n "'" a
3:'c

#2


引用楼主 o06v90o 的回复:
 
  
[root@testserver juhuaxia]# more a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
 
  

[root@testserver juhuaxia]#grep -n "\"" a
2:"b

[root@testserver ……

单引号和双引号我是这么认为的。单引号里面可以包含过滤双引号的正则表达式,双引号里面可以包含过滤单引号的正则表达式。单引号不能变量替换,双引号可以。看下面的例子。
$ var=lnnl
$ grep -n "$var" a
11:lnnl
$ grep -n '$var' a
# 没有任何结果


ababab这种正则很好写啊。
grep "\(ab\)\{3\}"
如果用扩展正则表达式的话,可以把那几个转义符去掉了。
grep "(ab){3}"

#3


引用 1 楼 linwhwylb 的回复:
为什么要转义呢?又不是特殊字符。

Python code

$ cat a
bbq 123a
"b
'c
bcdb
efgh
5555
h
i
j
k
lnnl
$ grep -n "\"" a
2:"b
$ grep -n "'" a
3:'c


为什么 grep -n "'" a 不能用 grep -n "/'" a呢?
单引号不是特殊符合?

#4


关键问题在于,使用grep的时候,转义字符有两套,一套属于linux系统,叫系统保留字,一套属于正则表达式,叫转义字符……
单引号和双引号的问题,只对系统保留字起作用,对正则的转义字符不起作用……
也就是说,在使用grep的时候,你输入的字符(无论是单引号还是双引号),都先要经过bash的分析和转义,这个时候单引号不做分析,双引号按照系统保留字进行分析,然后将分析的结果交给grep,grep利用正则表达式对字符串进行再分析,从而得到最终结果……
所以,对于grep转义的问题,LZ必须得清楚你要转义的字符究竟是按照系统保留字还是按照正则的转义字符来进行,因为系统保留字和正则转义字符有一些是共用的……

#5


楼上的大哥,能给我讲下
grep "\'" a

为啥他返回整个a文件的内容吗

#6


已经找到方法:

grep "\'" a
相当于
grep "" a
相当于
grep \^ a