sedの最短マッチとは?抜き取り方法を教えてください

このQ&Aのポイント
  • sedを使用して最短マッチを行い、指定した文字列の直後にある数字を抜き取りたい場合の方法を教えてください。
  • 質問の例では、"silent":の次に来る数字を抜く方法について具体的なコマンド例も挙げて説明してください。
  • 説明は簡潔に、かつ分かりやすく行ってください。
回答を見る
  • ベストアンサー

sedの最短マッチ

次の中から最初の"silent":の次に来る数字を抜くとします。 {"listen":{"silent":3,"item":0},"time":{"silent":[100,50,20,5],"item":[1000,500,200,50]}} echo -n '{"listen":{"silent":3,"item":0},"time":{"silent":[100,50,20,5],"item":[1000,500,200,50]}}' | sed 's/[^silent]*silent":\([0-9]*\).*/\1/' のようにすると、 {"listen3 という結果になってしまいます。 何か良い方法はありませんでしょうか? よろしくお願い致します。

  • inshin
  • お礼率78% (104/133)

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

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

>前方と同じ数字だった場合は sed -e 's/"silent":/^A/' -e 's/.*^A\([0-9][0-9]*\).*/\1/' とかですかね。一度別の文字、上記では「コントロールA」に置換する。 コントロール文字じゃなくて(元のテキスト中に出てこない)普通の文字列でも良いですが。 RubyやPerlをつかうと自然に書けますけど。

inshin
質問者

お礼

なるほど。こういうやり方もあったんですね!ありがとうございました。

その他の回答 (1)

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

3を取りたいと言うことでいいでしょうか? sed 's/.*"silent":\([0-9][0-9]*\).*/\1/'

inshin
質問者

お礼

ご回答いただきまして、ありがとうございます。 もし後方が配列ではなく、前方と同じ数字だった場合は何か方法はありませんでしょうか? 例えば: {"listen":{"silent":3,"item":0},"time":{"silent":5,"item":50}}

関連するQ&A

  • UNIX sed

    UNIX初心者なのですが、 sedをつかって、行末を改良文字に変換する方法ってどのようにやるのですか? sed 's/$/\n/' では、行末をnにしてしまいます。 詳しい方教えてください!

  • Q>変数をsedで編集する方法

    Bシェル内で変数をsedで編集しようとしているのですがうまくかないので教えてください。 変数SET_NO(=1.2.3-45)から.をとったものを変数EDIT_NOに入れようとしています。 ------------------------------------------------- SET_NO=1.2.3-45 #echo ${SET_NO} | sed -e "s/\.//g" #(0) #echo ${SET_NO} | sed -e "s/\.//g" | read EDIT_NO #(1) echo ${SET_NO} | sed -e "s/\.//g" > EDIT_NO #(2) read -u EDIT_NO #(3) echo "SET_NO=${SET_NO}" echo "EDIT_NO=${EDIT_NO}" ------------------------------------------------- (0)を有効にするとSET_NO=1.2.3-45となりsedはできています。 その結果を変数EDIT_NOに入れようとして(1)にしましたがEDIT_NOには何も入りませんでした。 (2)にしたら、EDIT_NOというファイルができてその中に入ってしまいました。そこで(3)を追加して読み込もうとしましたが read: EDIT_NO: invalid file descriptor specification となって読み込めません。 SET_NO 1.2.3-45から.をとったものをEDIT_NOに入れるにはどうすればいいのでしょうか。教えてください。よろしくお願いします。

  • SEDの使い方

    こんにちは。 sedである複数行のパターンにマッチしたら置き換えるということをしたいのですが上手くいきません。 たとえば、 test.txt aaa bbb ccc に対して、 sed -i.bak s/aaa/aaa'\n'111/g test とすると、 test.txt aaa 111 bbb ccc となります。 これを戻す方法として、 sed -i.bak s/aaa'\n'111/aaa/g test としても、元に戻りません。 sedを用いで元に戻す方法をご教示いただけないでしょうか。 よろしくお願い致します。

  • aliasを利用したsedコマンド

    以下の環境において、 $ echo `testalias` 192.168.0.3 $ more test.txt Host 192.168.0.2 Hostname 192.168.0.2 IdentitiesOnly yes Host 192.168.0.3 Hostname 192.168.0.3 IdentitiesOnly yes Host 192.168.0.4 Hostname 192.168.0.4 IdentitiesOnly yes sedコマンドで必要な部分の抜き取りを実行したいのですが、 aliasを使わずに、通常の文字列での抜き出しは問題なく動作するのですが、 $ sed -n '/192.168.0.3/,/IdentitiesOnly/p' test.txt Host 192.168.0.3 Hostname 192.168.0.3 IdentitiesOnly yes $ sed -n '/`testalias`/,/IdentitiesOnly/p' test.txt aliasを呼び出すとうまく動作しないのですが、alias使って同様の結果を出力する方法はないでしょうか。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • ShellScriptでのsed

    いつもお世話になります。 今、仕事でShellscriptを組んでいるのですが、どうもうまくいきません。サジェスチョンをお願い致します。 データ '2007/02/08-00:00:09', 0, 0, 0, 欲しい結果 2007/02/08 00:00:090\t0\t0\t 1. date と timeの間の - をスペースに置き換える 2. シングルコートを削除する 3. ,スペースをタブに置き換える iには、ファイル名が入っています。 sed -e "s/\-\(\d\d\:\d\d\:\d\d\)/ \1/" $i > work.dat まず、これが動きません。 宜しくお願い致します。

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • grep,sedコマンドについて

    昨日に引き続き、またまた質問です。 昨日回答してくださった方、ありがとうございました。 その後自分でも色々勉強しまして、ファイルの中身を処理するにはgrepコマンドとsedコマンドが 有効である事が分かりました。 今回やりたいことは以下のファイルの数字と時間の部分(//のついている2行)の削除です //1 //00:00:03,600 --> 00:00:07,195 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx //2 //00:00:07,360 --> 00:00:09,635 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx     ・     ・ (実際のファイルには"//"はついていません) 理想の出力 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx (xxxxxの部分には英語の台詞が入ります) で、以下が自分が考えた方法です 1.sedコマンドのみで削除 $ sed "/[0-9]*\n[0-9][0-9].*/d" ファイル名 結果 ファイルの内容がすべて表示されるだけ (a) 2.grepコマンドで抽出しパイプ処理 まずgrepで削除部分を抽出 $ grep -P "^[0-9]*\n[0-9][0-9].*" ファイル名 結果 1    00:00:03,600 --> 00:00:07,195    2    00:00:07,360 --> 00:00:09,635         ・         ・    10    11         ・         ・ となり、1~9までの数字と時間はちゃんと表示され 10以降は数字しか出ません。 (b) また -P の部分を -E にすると、何も表示されません (c) (perlの正規表現と拡張正規表現の違いはここでは無いように思えますが・・・) 2は最初でつまづいたのでどのコマンドに渡して行を削除するかはまだ分かりません (d) 削除の際、2行まとめて行うのは、一行ずつ行うと、台詞の部分に数字のみが入っていた場合 削除されるのを防ぐためです 以上長くなりましたが(a)~(d)の質問、疑問に回答していただけると嬉しいです。 よろしくお願いします。

  • sedなどで、特定の文字列内の数値を抽出したい

    sedなどで、特定の文字列内の数値を抽出したい シェルスクリプト内で、sedなどを使って特定の文字列内の文字列を抽出したいのですが、どうすればいいでしょうか? たとえば、job 999 at 2016-09-28 00:00のなかから、job ~ at内の「999」を抜き出したいです。 echo job 999 at 2016-09-28 00:00 | sed -e 's///g'... のようにして実行させたいです。