grep・sedの正規表現について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014-3-14 14:43 | 最終変更
gndqj583  新米   投稿数: 3
正規表現の解説で、
?
+
で説明がありますが、それぞれ
¥?
¥+
でなくてもいいんでしょうか。

CentOS6.5で実際に試してみたのですが、
?や+だと、それぞれ文字列として認識されてしまいます。

下記のサイトでは、
linuxコマンドの正規表現とperlの正規表現で
分けて説明されています。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231171/
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-3-14 17:04
arashi1977  長老 居住地: 広島  投稿数: 1715
CentOS 6.4でちょっとやってみました。
[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
grepでは特にバックスラッシュは不要のようですね。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014-3-15 5:38 | 最終変更
gndqj583  新米   投稿数: 3
ご確認いただいたgrepですが、-Eオプションで拡張正規表現が使用できる設定(egrepと同じ)になっています。
-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
|が文字列として認識されているので、"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
-Eオプションをつけると拡張正規表現となるので
¥の後の"|"がエスケープされ、"abc|def"を含む行がマッチする
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-3-15 10:16
arashi1977  長老 居住地: 広島  投稿数: 1715


ぎゃー!
ごめんなさい、お仕事上の癖でつい-Eつけてしまいました…
確かに手元で-Eなしにしたら仰るとおりの結果になってます。

拡張じゃない正規表現使うのってどれだけ一般的なのかな…?

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.