質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Ruby

    7363questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • AWK

    66questions

    AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

  • sed

    57questions

    sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

  • grep

    33questions

    grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

不規則なパターンの文字列から特定の文字列を取得したい。(以下にサンプル例あり)

解決済

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 1,235

cDm_48

score 164

以下のようなテキストファイルがあったとして、
ここから括弧の中の文字列のみ取得したいです。

    t.string   "mypage", limit: 255
    t.string   "login",       limit: 255
    t.string   "password",    limit: 255
    t.datetime "created_at",                             null: false
    t.datetime "updated_at",                             null: false
    t.string   "hoge", limit: 255
    t.string   "piyo",       limit: 255
    t.string   "tera",    limit: 255

期待する結果。

mypage
login
password
created_at
updated_at
hoge
piyo
tera

UNIXコマンドのcutを用いて行おうと思ったのですが、
空白の数が違うため、私には解決することが出来ませんでした。

本問題に対する解決手段は
UNIXコマンド、awk、sed、rubyの中であれば何でも構いません。


また、今回は特徴が掴みやすい例かと思いますが、もっと複雑なパターンにも対応できるような
汎用的な回答があればとても助かります。



以下から同様に括弧の中の文字列を取得したい。

    t.string   limit: 255   "mypage"
    t.string   "login",       limit: 255
    "password",    limit: 255  t.string
    t.datetime "created_at",                             null: false
    t.datetime "updated_at",                             null: false
    limit: 255          t.string   "hoge"
    t.string   "piyo",       limit: 255
    "tera"   t.string     limit: 255


宜しくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/07/28 00:17

    ダブルクォートがエスケーブされる可能性も配慮した方がいいんですか?(例:"hello \"world\"!\n"とか)

    キャンセル

  • cDm_48

    2015/07/28 10:32

    ダブルクォートがエスケーブされる可能性も考慮していただけると個人的にはすごく助かります。 質問文が抽象的で申し訳ありませんでした。

    キャンセル

  • a_saitoh

    2018/01/05 15:28

    1行の中に”・・・”は1回しか出現しないですか?複数回出現するのだとかなり真面目にやらないといけないです。あと,エスケープされた引用符を含む場合、出力はエスケープされたまま?エスケープを外して?

    キャンセル

回答 7

+3

括弧の中じゃなくて、引用符の中ですよね?

引用符区切りの2つ目を出力。
cut -d'"' -f 2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/28 10:31

    cutコマンドでこういった表現方法があるんですね。
    まだまだ勉強不足でした。
    有り難うございます!

    キャンセル

+1

ykt68 さんのほぼパクリですけど、Ruby のワンライナーならこんなかんじで。

ruby -pe '$_="#$1\n"if/"(\w+)"/=~$_'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

たとえば、sed のワンライナーだと以下のように書けます。(正規表現の書き方が若干冗長ですが)

$ sed 's/^[^"]*"//;s/"[^"]*$//' test.txt

解説するまでもないかもしれませんが、これは各行の「行頭から最初の " までを削除」し、その後、「次の " から行末までを削除」するという意味です。

awk だと以下のように書けます。

$ awk -F'"' '{print $2}' test.txt

これは、意味的には otnさん の回答にある

$ cut -d'"' -f 2

と類似していて、" を区切り文字とみなして2カラム目を表示するということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

括弧ではなく、引用符の中の文字列を抽出したいという趣旨と解釈して、
以下のように、正規表現を使ってRubyで書いてみました。
# coding: utf-8

File.open "test.txt" do |f| 
  f.each_line do |line|
    if /"([a-z_]+)"/ =~ line
      print $1, "\n"
    end 
  end 
end

test.txt は以下です。
t.string   limit: 255   "mypage"
t.string   "login",       limit: 255
"password",    limit: 255  t.string
t.datetime "created_at",         null: false
t.datetime "updated_at",         null: false
limit: 255          t.string   "hoge"
t.string   "piyo",       limit: 255
"tera"   t.string     limit: 255

上記のrubyプログラムを実行すると以下が表示されます。
mypage
login
password
created_at
updated_at
hoge
piyo
tera
なお上記のコードでは、以下の2点を前提にしています。
・各行に、" で囲まれた文字列が(最大で)1個だけ含まれる。
・引用符 " で囲まれた文字列は、半角アルファベットもしくはアンダースコアのみから構成される。 

参考になれば幸いです。

追記
回答してから気がつきましたが、ご質問の意図としては、
 プログラムを書かないで1行のUNIXコマンドで実現したい。
ということだったのでしょうか?
だとしたら、私の回答は不適切なのですみませんがスルーしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/28 10:30

    言葉足らずで申し訳ありません。
    必ずしもプログラムを書かないで1行のUNIXコマンドで実現したいというわけではありません。

    rubyの勉強もしておりますので、大変勉強になりました。

    UNIXコマンド、awk、sed、rubyの中で指定させていただいたのは、いろんな表現方法を知りたかったためです^^

    わかりやすい解説で大変参考になりました。
    有り難うございます!

    キャンセル

0

otn さんの cut で十分だと思いますけれども、gnu の grep なら次のように言明を使ってもできました。

grep -Po '(?<=").*?(?=")'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

#!/usr/bin/ruby

while line = ARGF.gets
  line.scan(/"[^\n]*?[^\\]"/) {|s| eval("puts " + s)}
end
Rubyを使用した実行可能なUNIXコマンドです。
文字のエスケープは、Rubyの仕様に準じます。
空文字は無視します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

pi-chanさんがawkで書かれてますが
一番短いのは
awk '{print $2}' "ファイル名" | sed 's/\"//g'
かと思います。awkのフィールドセパレータは連続スペースがデフォルトでセットされてます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 15:19

    pi-chanさんの回答に比べて短くもないし、質問文にある"もっと複雑なパターン"にも対応できない。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7363questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • AWK

    66questions

    AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

  • sed

    57questions

    sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

  • grep

    33questions

    grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。