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

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

ただいまの
回答率

90.33%

  • Linux

    4043questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • sh

    297questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

特定のファイルから、文字列を抜き出したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 299

Y_M

score 241

 前提・実現したいこと

とあるテキストファイルがあり、その中から特定の文字列を抜き出したいのですが方法がわかりません。
ひとまずはgrepで対象の行を取得することは出来ていますが、そこから対象の文字を取得することが出来ずにいます。

取得したい文字はtest_month"数字"になり、数字の部分は可変になります。

 該当ファイル(ファイル名:"Sample.txt")

〜 省略 〜

image"sample"test_minutes"0"test_day"15"test_month"5"

〜 省略 〜

 該当のソースコード

grep -a 'test_month' Sample.txt

 追記

イメージ説明

出力結果

verified"1"created_atC;"dd"15"    yyyy"    2018"mm"5"test_minutes"0"test_day"15"test_month"5"visited_edateC;"dd"15"    yyyy"    2018"mm"5"created_at_side"
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • dodox86

    2018/05/16 18:05

    どんなデータを入力した時にどんなデータの出力を期待しているか、詳細に書いてもらえないと求める答えにいきづらいと思います。Sample.txtの中身がこうである場合、出力がああなる、等。

    キャンセル

  • Y_M

    2018/05/16 18:09

    Sample.txtの中身は該当部分の前後にその他文字列が存在しますが記載の通りです。出力としては「test_month"5"」となるのが今回の理想です。もし Sample.txtの中身が変更され、"test_month"30"などになった場合は、「test_month"30"」と出力される形が良いです。

    キャンセル

回答 1

checkベストアンサー

+1

 grep -a 'test_month' Sample.txt | sed -E 's/.*(test_month)\"([0-9]+)\"/\1"\2"/'


でどうでしょう?

--追記
もし、1つのファイルに他に同じフォーマットの文字列があり、かつその最終行だけが欲しいのだとしたら

 grep -a 'test_month' Sample.txt | tail -n 1 | sed -E 's/.*(test_month)\"([0-9]+)\"/\1"\2"/'


のように最後の一行だけ欲しい(tail -n 1)とするとできますが、これでいいかは不明

--追記
そうではなかった模様。得られた(しかし望ましくなかったという)結果からすると

sed -E 's/.*(test_month)\"([0-9]+)\"/\1"\2"/'


[0-9]+のところを

sed -E 's/.*(test_month)\"(.*)\"/\1"\2"/'


な感じにしたのではないかと思われる

sed -E 's/.*(test_month)\"(.*?)\"/\1"\2"/'


とすると"最短マッチ"になると思うがいかがでしょうか

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/16 17:52

    学習し始めたばっかりで質問ばかりになってしまい申し訳ありません。

    sed: illegal option -- r
    usage: sed script [-Ealn] [-i extension] [file ...]
    sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

    このように出てきてしまいます。

    キャンセル

  • 2018/05/16 17:56 編集

    もしかして、macですか?
    sed -rのところのrを大文字のE(sed -E)にしてどうでしょうか?

    キャンセル

  • 2018/05/16 17:58

    ご返答ありがとうございます。
    調べていたところちょうど記事を発見し、"-E"で実行しましたところ、"5"と返ってきました。

    キャンセル

  • 2018/05/16 18:15 編集

    すみません、質問を正確に読んでなかったです。修正しました(test_monthも出るように。また質問への回答例にあった30のような二桁以上の数値にも対応していると思います)
    ()が出現順に\1,\2で参照できます。

    キャンセル

  • 2018/05/16 18:25

    言葉足らずで申し訳ありません。
    想定した出力になりました!が本来このコマンドをかけたいファイルでやると、該当行すべてが出力される形となってしまいました。
    元ファイルを公開できれば良いのですが、難しいので心当たりがあればご教授いただけると幸いです。

    キャンセル

  • 2018/05/16 18:40 編集

    質問で返して申し訳ないのですが確認させてください。
    image"sample"test_minutes"0"test_day"15"test_month"5"
    image"sample"test_minutes"0"test_day"15"test_month"6"
    というのがあって、
    test_month"5"
    test_month"6"
    となったということですか?

    やりたいことは最後の1行だけにしたいということですか?
    →回答に追記

    キャンセル

  • 2018/05/16 18:57

    うまく伝えられずに申し訳ありません。。。
    質問に追記しましたが、画像のようなSample.txtでは出力結果のような状態になっていしまいます。

    キャンセル

  • 2018/05/16 19:11

    追記しました
    何が固定なのか。何が変動するのか。変動するものは何なのか(数値なのか英字なのか)。何を区切り文字(境目)にするか。といった点を日本語で補足していただければ、改変方法を提案しやすいです。

    キャンセル

  • 2018/05/17 10:14

    sed: 1: "s/.*(test_month)\"(.*?) ...": RE error: repetition-operator operand invalid
    上記のようなエラーが発生します。

    解決には至っていないのですが、そもそもの知識が足りていないので、もう少し学習してみます。
    大変お手数おかけいたしました。ありがとうございました。

    キャンセル

  • 2018/05/17 13:22

    http://www.megasoft.co.jp/mifes/seiki/about.html
    など、正規表現、サンプルなどで検索してみてはいかがでしょう。

    キャンセル

  • 2018/05/17 13:32

    ありがとうございます。参考にさせていただきます。

    キャンセル

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

  • Linux

    4043questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • sh

    297questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。