grep・sedの正規表現について
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
grep・sedの正規表現について
msg# 1
gndqj583
投稿数: 3
正規表現の解説で、
?
+
で説明がありますが、それぞれ
¥?
¥+
でなくてもいいんでしょうか。
CentOS6.5で実際に試してみたのですが、
?や+だと、それぞれ文字列として認識されてしまいます。
下記のサイトでは、
linuxコマンドの正規表現とperlの正規表現で
分けて説明されています。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231171/
?
+
で説明がありますが、それぞれ
¥?
¥+
でなくてもいいんでしょうか。
CentOS6.5で実際に試してみたのですが、
?や+だと、それぞれ文字列として認識されてしまいます。
下記のサイトでは、
linuxコマンドの正規表現とperlの正規表現で
分けて説明されています。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231171/
Re: grep・sedの正規表現について
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
CentOS 6.4でちょっとやってみました。
grepでは特にバックスラッシュは不要のようですね。
[root@host etc]# pwd
/etc
[root@host etc]# grep -E 'igm?p' protocols
igmp 2 IGMP # internet group management protocol
igp 9 IGP # any private interior gateway (Cisco: for IGRP)
nsfnet-igp 85 NSFNET-IGP # NSFNET-IGP
[root@host etc]# grep -E 'c+p' protocols
tcp 6 TCP # transmission control protocol
dccp 33 DCCP # Datagram Congestion Control Protocol
cpnx 72 CPNX # Computer Protocol Network Executive
cphb 73 CPHB # Computer Protocol Heart Beat
micp 95 MICP # Mobile Internetworking Control Pro.
scps 105 SCPS # SCPS
[root@host etc]# grep -E '+tp' protocols
# See also http://www.iana.org/assignments/protocol-numbers
irtp 28 IRTP # Internet Reliable Transaction Protocol
iso-tp4 29 ISO-TP4 # ISO Transport Protocol Class 4
xtp 36 XTP # Xpress Tranfer Protocol
idpr-cmtp 38 IDPR-CMTP # IDPR Control Message Transport Proto
tp++ 39 TP++ # TP++ Transport Protocol
cftp 62 CFTP # CFTP
vmtp 81 VMTP # Versatile Message Transport
secure-vmtp 82 SECURE-VMTP # SECURE-VMTP
ttp 84 TTP # TTP
mtp 92 MTP # Multicast Transport Protocol
gmtp 100 GMTP # GMTP
l2tp 115 L2TP # Layer Two Tunneling Protocol
iatp 117 IATP # Interactive Agent Transfer Protocol
stp 118 STP # Schedule Transfer
ptp 123 PTP # Performance Transparency Protocol
crtp 126 CRTP # Combat Radio Transport Protocol
sctp 132 SCTP # Stream Control Transmission Protocol
Re: grep・sedの正規表現について
msg# 1.2
gndqj583
投稿数: 3
ご確認いただいたgrepですが、-Eオプションで拡張正規表現が使用できる設定(egrepと同じ)になっています。
-Eオプションがない場合は、¥が必要です。
作成したサンプル
¥がないと"+"という文字列として認識されるので
a+aを含まない行がマッチしない
¥があると+がメタキャラクタとして認識されるので
aが2回連続しない"a+a"はマッチしなくなる。
|が文字列として認識されているので、"abc|def"を含む行のみマッチ
¥があると|がメタキャラクタとして認識されるので
"abc"または"def"どちらか一方が含まれているとマッチする
参考
-Eオプションをつけると拡張正規表現となるので
¥の後の"|"がエスケープされ、"abc|def"を含む行がマッチする
-Eオプションがない場合は、¥が必要です。
作成したサンプル
[user@LPIC101 grep]$ cat regexp.txt
a
a+a
a+aa
aaa
xxa
xxaa
xxaaa
abc|def
abc
def
acb
dfe
[user@LPIC101 grep]$ grep 'a+a' regexp.txt
a+a
a+aa
a+aを含まない行がマッチしない
[user@LPIC101 grep]$ grep 'a\+a' regexp.txt
a+aa
aaa
xxaa
xxaaa
aが2回連続しない"a+a"はマッチしなくなる。
[user@LPIC101 grep]$ grep 'abc|def' regexp.txt
abc|def
[user@LPIC101 grep]$ grep 'abc\|def' regexp.txt
abc|def
abc
def
"abc"または"def"どちらか一方が含まれているとマッチする
参考
[user@LPIC101 grep]$ grep -E 'abc\|def' regexp.txt
abc|def
¥の後の"|"がエスケープされ、"abc|def"を含む行がマッチする
Re: grep・sedの正規表現について
msg# 1.2.1
arashi1977
居住地: 広島
投稿数: 1715
ぎゃー!
ごめんなさい、お仕事上の癖でつい-Eつけてしまいました…
確かに手元で-Eなしにしたら仰るとおりの結果になってます。
拡張じゃない正規表現使うのってどれだけ一般的なのかな…?