• ベストアンサー

文字列を検索してマッチした単語を返す

ある文字列でgrepして得た結果からその文字列を含む単語をぬきだすにはどうすればよいでしょうか? Perlかsedか何かでできればコマンドラインでできるといいのですが。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

>watashinonamaeha ほげほげ desu >をnamaeでgrepして結果を得たとして tr コマンドで空白が改行に置換されますから、その出力を grep namae すると watashinonamaeha だけが引っかかりますよ。書いた通りやってみましたか? 空白だけでなくタブも改行に置換するなら、 tr '空白タブ' ' ' < file | grep namae です。シェルの設定によってはタブ文字を入力できないので、その場合は ctrl-V tab と打ちます。

vivi0303
質問者

お礼

ありがとうございます。 コマンド使い方がよくわからなかったので。 tr で空白を改行にするということだったんですね。 tr ' ' '\n' <fileでうまくいきました。 ありがとうございます。^^

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

No.2のham_kamoです。 notnotさんの回答の方がずっとスマートなので、私の回答は無視していただいてよかったのですが、一応補足します。 for(i=1;i<=NF;++i) if ($i~s)print $i の部分ですが、awkはデフォルトで空白をフィールドの区切りとして解釈し、1行の中の1つめがフィールドを$1、2つめのフィールドが$2、というようになります。これは変数を使っても同じでi=1のときに$iとすると、それは$1のことになります。 フィールドの数はNFという値に保存されるので、つまり上の式は、最初ののフィールドから最後のフィールドまでループをまわす、要はこの質問でいうと「各単語において」ということです。 if ($i~s)print $i ですが、~は正規表現にマッチするか、という意味で、sというのは変数で、その中身はawkに渡すときに-vオプションで設定しているので、検索文字列が入っています。各項目が検索文字列にマッチしたら、その項目を表示する、という意味です。 したがって、 watashinonamaeha ほげほげ desu を処理すると、 $1 = watashinonamaeha $2 = ほげほげ $3 = desu となり、i=1のときに $i="watashinonamaeha"、s="namae"なので $i~s が成立し、$iであるwatashinonamaehaが表示されます。

vivi0303
質問者

お礼

ありがとうございます。 awkでも正規表現にマッチするか判定できるのですね。 有用でした。ありがとうございました。^^

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

#1です。すいません、訂正。 tr ' ' ' ' < file | grep abc tr コマンドは引数にファイルを取れないのでリダイレクトしないといけないのですが、つい忘れてしまいます。

vivi0303
質問者

お礼

ありがとうございます。 区切り文字は半角スペースまたはタブでいいのですが、 日本語の単語がまじっていてもよいでしょうか?

vivi0303
質問者

補足

例えば watashinonamaeha ほげほげ desu をnamaeでgrepして結果を得たとして そこからwatashinonamaehaをぬきだすみたいな。 perl -e 's/(\S*)(namae)(\S*)\s/$1$2$3/'見たいな感じで できるでしょうか? 後方参照は括弧でくくれば参照の対象になるになるということで よいでしょうか?

すると、全ての回答が全文表示されます。
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

No.1さんの仰るとおり、空白で区切られていないと単語として抽出するのは非常に難しいですが、英文か何かと仮定して awkを使ってやってみました。 grep abc test | awk -v s=abc '{for(i=1;i<=NF;++i) if ($i~s)print $i}' abcの部分はシェルスクリプト内で変数で処理するのであれば、変数に置きかえてください。

vivi0303
質問者

お礼

ありがとうございます。 if ($i~s)というのはどういう意味でしょうか? iには数字が入っていますよね?

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

単語というのは、ファイルは英文テキストで、空白で区切られた英字列を単語とみなすということでいいでしょうか? 日本語の単語だと辞書がないと単語が区切れません。 tr ' ' ' ' file | grep abc

すると、全ての回答が全文表示されます。

関連するQ&A