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

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

ただいまの
回答率

91.34%

  • 正規表現

    574questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

  • シェル

    210questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • sed

    48questions

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

sedで数字のみ抜き出す

受付中

回答 4

投稿 2015/08/26 17:29 ・編集 2015/08/26 17:31

  • 評価
  • クリップ 1
  • VIEW 22K+

takkuru98

score 2

不特定多数の文字列の中から数字のみ抜き出すシェルスクリプトを書こうとしています。

例 :  hoge123moge > 123 のみ抽出、hoge や moge は不特定。

この場合、以下のようになると考えたのですが、すべて出力されてしまいます。

echo "hoge123moge" | sed -e 's/^*\(\[0-9\]*\)$/\1/g'
hoge123moge

どのように修正すれば数字のみ出力できるか、教えていただければ幸いです。

どうぞ、よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+3

sed の練習が目的でなければ、その目的に最適なのは grep です。
grep -o '[0-9]*'
ただし、数字ごとに改行されます。

abc123def456ghi のような1行に数字が複数あるデータの場合はどうしたいでしょうか?

投稿 2015/08/26 19:11

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

これでどうですか?
単なる思い付きで動作確認も出来ていませんが、数字以外を削除するという意味です。
echo "hoge123moge" | sed -e 's/[^0-9]//g'


tr コマンドで、数字と改行以外を削除するという手もあります。
echo "hoge123moge" | tr -cd '0123456789\n'

投稿 2015/08/26 17:42

編集 2015/08/26 20:43

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

注意:話を簡単にするため、実行環境都合によるエスケープ"\"は一旦無視し、あくまで正規表現上の話に限定します。

不特定多数の文字列の中から数字のみ抜き出すシェルスクリプトを書こうとしています。 
やり方は幾つかあると思いますが、一番単純なのは既に別の方の回答にある通り、

  置換前:[^0-9]
  置換後:(空)

とするのが簡単だし、仮に同一行内に数字が複数回出現した場合でも数字以外を削除することができるため汎用性があります。

  例)hoge123piyo456fuga

ただし、上記の例では汎用性がありすぎるというのであれば、限定的な方法もあります。例えば英字数字英字のパターンにマッチした場合のみ数字だけを残したい、とするならば、

  置換前:^[a-zA-Z]+([0-9]+)[a-zA-Z]+$
  置換後:\1

とすればかなり限定したパターンマッチになります。目的に応じて使い分けてください。



ではなぜ、takkuru98さんのコマンドではダメだったか。

  置換前:^*([0-9]*)$
  置換後:\1

  ※実行環境都合によるエスケープはを除外しています

まずは置換前の最初の2文字"^*"についてです。
恐らくやりたかったことは「何かしらの数字以外の文字列」を表現したいと理解しました。
正規表現のルールに則ると、2文字目の"*"は1文字目の"^"にかかっています。
"*"は直前の文字列を「0個以上繰り返し」ですから、行頭を意味する"^"を「0個以上繰り返し」としても、よく意味がわかりませんね^^;


次に置換前の括弧で括られた部分"([0-9]*)"ですが、これは問題ありません。
ただ、この場合は数字が0個の場合でもパターンとしてマッチしますので、必ず数字が出てくるケースに限定したいのであれば"*"を"+"(1個以上の繰り返し)にして下さい。


置換前の最後は特にパターンマッチさせることなく行末"$"で終わっていますが、"hoge123moge"でいうところの"moge"に当たるパターンを指定しなければなりません。英字に限定するのであれば"[a-zA-Z]+"、数字以外とするならば"[^0-9]+"とすれば良いでしょう。



余談になりますが、私が正規表現の確認する際はよくサクラエディタを使用しています。サクラエディタに文字列を並べ、正規表現を指定で検索でマッチした範囲が色付けされるので便利です。ただし、サクラエディタの正規表現は多少拡張されているため、その辺はヘルプを見ながら、あるいは実際にsedを実行して最終確認をするのがよいかと思います。

投稿 2015/08/30 23:37

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

\+ の箇所と、前の方がご説明されておられる、 .* の箇所がまずかったようです。
gオプションは、この場合、a-z , 0-9 , a-z の塊で登場しなくてはなりませんが、
次の繰り返しでa-zがつながってしまうのでマッチできる文字列になりません。

echo 'hoge123moge' | sed -e "s/^[a-z]\+\([0-9]\+\)[a-z]\+$/\1/"
123

おそらく繰り返し登場する数字を抽出するという目的だと思いますので、
前出の grep , trがお勧めです。

投稿 2015/08/31 00:19

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.34%

関連した質問

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

  • 正規表現

    574questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

  • シェル

    210questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • sed

    48questions

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