grepでのグルーピングの扱いについて

このQ&Aのポイント
  • grepコマンドで複数のグルーピングされた正規表現にマッチする文字列を取得する方法について調査しています。
  • GNU awkコマンドでは可能であることがわかりましたが、grepコマンドだけでも実現できるのか疑問です。
  • 具体的な例を挙げて、正規表現にマッチする文字列がグルーピングされた場合の取得方法について知りたいです。
回答を見る
  • ベストアンサー

grepでのグルーピングの扱いについて

複数のグルーピングされた正規表現にマッチする文字列を取り出したいと思っています。 GNU awkコマンドではできるようですが、grepコマンドだけでも可能でしょうか? ■例 # 対象文字列: str="bash dash zsh" # 正規表現: re="([^ ]).+[ ]([^ ]).+[ ]([^ ]).+" # 欲しい結果(グルーピングされた正規表現にマッチする文字列) 1番目のグルーピングに対して: b 2番目のグルーピングに対して: d 3番目のグルーピングに対して: z ■環境 $ grep --version grep (GNU grep) 2.16 よろしくお願いします。

noname#241088
noname#241088

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

「グルーピング」というのがいまいちわかりませんが、"bash dash zsh"から "b" "d" "z" を得るなら、 grep -o -P '(\A| )\K\S' でどうでしょうか。先頭または空白の直後の非空白文字です。 \K以前はマッチ結果から除かれます。

noname#241088
質問者

お礼

notnotさん お世話になっております。 Perl正規表現だとこんなことができるのですね。 (拡張正規表現ではできないですよね?) 勉強になりました。 どうもありがとうございました。

関連するQ&A

  • [awk]マッチしたものをすべて取り出したい

    awk(GNU awk)を使って正規表現にマッチした部分文字列を最初にマッチしたものだけでなく、すべて取り出したいと思っています。 grepコマンドを使うと次のように簡単に取得できるのですが、awkだけで実現する場合どのように記述したらよいのでしょうか? ■例 $ echo 'abcdebx' | grep -o 'b.' 結果: bc bx # 最初にマッチしたものだけなら取得できる $ echo 'abcdebx' | awk 'match($0, /b./) {print substr($0, RSTART, RLENGTH)}' 結果: bc ■環境 GNU Awk 4.0.1 よろしくお願いします。

  • grepにマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • grepコマンドでの文字列検索

    grepコマンドについて質問です。 grepコマンドでCSVファイルを参照し、ある項目に特定の文字列でないものがあれば、そのファイル名を取得する処理をしたいと思っています。 つまり、ある項目を$strとすると $str <> 'aaaaaa' という処理をgrepで行おうと考えています。 現状では、 grep -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^(aaaaaa)]' ファイル名 等を試していますが、[^(aaaaaa)]だと一文字目しか判別できていないようです。[^a{6}]などもうまくいきません。 何かいい方法があれば教えて頂きたいと思います。 宜しくお願いします。

  • シェル関数引数のスペース文字列をgrepに

    下記のシェル関数 arg_space() 内で、grepを使いたいのですが。 'aaa bbb' などのスペースを含む文字列を引数として渡すとスペース後の文字列がファイル名と 認識されてしまいます。 -- arg_space.sh -- #!/bin/bash CHK_STR='aaa bbb' FILE_NAME='data/aaa.txt' function arg_space() { return `grep -c $1 $2` } arg_space $CHK_STR $FILE_NAME if [ $? -ge 1 ]; then echo 'Match !!' else echo 'No match.' fi exit 0 ------------------ ]# ./arg_space.sh grep: bbb: No such file or directory Match !! スペース文字を、grep に区切り文字として認識させないようにする 方法を教えて 頂けないでしょうか。 -- data/aaa.txt -- aaa bbb ccc ddd ---------------

  • grepの出力について

    パターンマッチについてなんですが、このコマンドはマッチした行を出力するコマンドなんですが。実際にはパターンマッチをした文字列だけを表示したいという場合にはどのようにしたらよいのでしょうか?スクリプトを書くしかないのでしょうか?できればその例を教えてください。お願いします。

  • grepの使い方

    "A.lst"と"B.lst"の2つのファイルがあります。 ともにディレクトリ階層の一覧が記述されています。 2つのファイルを比較して、A.lstのディレクトリ階層の文字列を 含む行を、B.lstから抽出して、リダイレクトで出力するには、 どういうコマンド操作になるのでしょうか。 特定の文字列ならば単純に、cat B.lst | grep moziretsu > sample.lst でいいわけですが、この文字列がA.lstファイル内に複数行あり、 それを順にgrepするにはどうすればいいのかがわかりません。 シェルもただいま勉強中です。 よろしくご教授願います。

  • grepの出力結果の保存

    LinuXのgrepコマンドに関する質問です。 既存のファイルからgrepコマンドで特定の文字列が含まれた行だけを抽出し、その行数を数えるという課題です。 行数を数えるのでwcコマンドを使おうと思ったのですが、wcコマンドは「wc (ファイル名)」という使い方をしますよね。 ということは、grepコマンドで抽出した結果をファイルに保存しなくてはならないのですが、やり方がわかりません。

  • Grepする際の検索方法について

    こんばんは。 さくらエディタのGrep検索で次のような検索をしたいと思っていますが どのように行えば良いでしょうか? 例)「コンピュータ」と「コンピューター」の文字列が混在するファイル、フォルダから「コンピュータ」のみを検索する 普通に「コンピュータ」で検索すると当然ながら「コンピューター」もヒットしてしまいます。「コンピュータ」となっているもののみ抜き出したいのです。 正規表現を使えば解決できると、なんとなく分かるのですが方法を探してみましたが正規表現自体難しいので理解できませんでした。 宜しくお願い致します。

  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • perl上でのgrepでエラーとなる文字の対応

    perlプログラム内で、grepを行っております。 grep対象の中身に +、*、(、)、[、]などの文字列が含まれているため、エラーとなり、 プログラムがうまく動作しません。 grepしたい対象データ例:http://www.XXX.co.jp/○○+▲▲ http://www.XXX.co.jp/○○+▲▲の+を 文字として判断し、正規表現扱いではないとしたい。 http://www.XXX.co.jp/○○+▲▲を含む文字を抽出したい。 perl プログラムにおいて @line1 = grep(/$url/,<ARG>); という記述しておりますが、どのように変更すればよいでしょうか? また、grepしたい対象データがファイルに格納されておりますが、 その中で、+を \+ にファイル一括変換する場合、:%s/+/\+/g で やろうとしても、変換されません。 perlプログラムでの対応、grep元ファイルの変換処理方法 それぞれのやり方について教えてください。

    • ベストアンサー
    • Perl