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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

grep

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

sed

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

AWK

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

Q&A

解決済

7回答

2680閲覧

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

kento2543

総合スコア163

Ruby

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

grep

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

sed

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

AWK

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

0グッド

0クリップ

投稿2015/07/27 13:45

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

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

宜しくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/07/27 15:17

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

2015/07/28 01:32

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

2018/01/05 06:28

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

回答7

0

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

引用符区切りの2つ目を出力。

bash

1cut -d'"' -f 2

投稿2015/07/27 14:00

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kento2543

2015/07/28 01:31

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

0

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

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

投稿2015/07/28 01:45

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/01/05 05:14

編集2018/01/05 05:18
suga000

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/01/05 06:19

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

0

ベストアンサー

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

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

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

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

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

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

$ cut -d'"' -f 2

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

投稿2015/07/28 16:58

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Ruby

1#!/usr/bin/ruby 2 3while line = ARGF.gets 4 line.scan(/"[^\n]*?[^\\]"/) {|s| eval("puts " + s)} 5end

Rubyを使用した実行可能なUNIXコマンドです。
文字のエスケープは、Rubyの仕様に準じます。
空文字は無視します。

投稿2015/07/28 15:11

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2015/07/28 01:36

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

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

ruby

1# coding: utf-8 2 3File.open "test.txt" do |f| 4 f.each_line do |line| 5 if /"([a-z_]+)"/ =~ line 6 print $1, "\n" 7 end 8 end 9end

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/27 14:14

編集2015/07/27 14:31
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kento2543

2015/07/28 01:30

言葉足らずで申し訳ありません。 必ずしもプログラムを書かないで1行のUNIXコマンドで実現したいというわけではありません。 rubyの勉強もしておりますので、大変勉強になりました。 UNIXコマンド、awk、sed、rubyの中で指定させていただいたのは、いろんな表現方法を知りたかったためです^^ わかりやすい解説で大変参考になりました。 有り難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問