アプリ版:「スタンプのみでお礼する」機能のリリースについて

行末の正規表現について。

端末で次のようにbashが起動しています。
$ ps | grep 'sh'
2510 pts/1 00:00:00 bash

正規表現を使って、「shの後ろが空白もしくは行末」という文字列を次のように検索できます。
$ exp='sh *$'
$ ps | grep -E "$exp"
2510 pts/1 00:00:00 bash

次の表現でも検索されるのではないかと思うのですが、行末$は[ ]に入れることはできないのでしょうか?
~$ exp='sh[ $]'
$ ps | grep -E "$exp"
(ヒットなし)

2016年9月22日

A 回答 (2件)

[]の中では、$は行末の意味を持ちません。

$の文字そのものになります。
同様に^は、[]の中では、行の先頭の意味は持ちません。[]の先頭におかれた場合は、以降の文字以外の意味になります。
例 [^123]・・・・123以外の文字にマッチ
以下は、man grepからの抜粋です。(正規表現の部分)

[ と ] で囲まれた文字のリストは、そのリスト中に含まれるどれか 1 文字にマッチします。ただ
し、リストの先頭がキャレット ^ の場合は、そのリストに含まれ ない文字にマッチします。例 え
ば、正規表現 [0123456789] は数字 1 文字にマッチします。文字の範囲は最初と最後の文字をハイ
フン (‘-’) でつなぐことで指定できます。最後に、特定の名前を持つ文字クラスがあらかじめ定義
さ れ て い ま す 。 名 前が内容を示しており、それらは、 [:alnum:], [:alpha:], [:cntrl:],
[:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:]
で す。例えば、 [[:alnum:]] は [0-9A-Za-z] と同じですが、後者は POSIX ロケールや ASCII コ
ード順に依存しますので、前者の方がロケールや文字集合に依存しません。 (クラス名の中の角 括
弧 はシンボル名の一部であり、リストを区切る角括弧とは別に指定する必要があることに注意) リ
ストの中では、ほとんどのメタ文字は通常の文字として扱われます。リテラル ] を含めるには、こ
の文字をリストの先頭に置いてください。同様に、リテラル ^ を含めるには、この文字をリストの
先頭以外に置いてください。リテラル - を含めるには、この文字をリストの最後に置いてください
    • good
    • 1
この回答へのお礼

tatsu99様、懇切丁寧な解説をありがとうございます。よくわかりました。
"^]-"で説明頂いたようなところが正規表現のアクロバチックなところで、覚えにくいです。

お礼日時:2016/09/22 17:24

「sh |sh$」や「sh( |$)」と記述されてはいかがでしょうか。



行末$を[ ]に入れる事が出来るか出来ないかにつきましては、ちょっと分からないです。
    • good
    • 0
この回答へのお礼

kon77様、ありがとうございます。
いろいろな表現方法があるが、よく理解していないと、できているつもりができていなかったりするということですね。

お礼日時:2016/09/22 17:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!