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

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

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

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

シェル

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

正規表現

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

Q&A

4回答

79088閲覧

sedで数字のみ抜き出す

takkuru98

総合スコア10

sed

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

シェル

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

正規表現

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

1グッド

2クリップ

投稿2015/08/26 08:29

編集2015/08/26 08:31

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

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

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

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

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

どうぞ、よろしくお願いいたします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

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

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

投稿2015/08/26 10:11

otn

総合スコア85766

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

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

0

これでどうですか?
単なる思い付きで動作確認も出来ていませんが、数字以外を削除するという意味です。

sed

1echo "hoge123moge" | sed -e 's/[^0-9]//g'

別解として、tr コマンドで、数字と改行以外を削除するという手もあります。

echo "hoge123moge" | tr -cd '0123456789\n'

投稿2015/08/26 08:42

編集2015/08/26 11:43
pi-chan

総合スコア5936

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

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

0

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

shell

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

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

投稿2015/08/30 15:19

Ken.sakanakana

総合スコア1768

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

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

0

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

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

やり方は幾つかあると思いますが、一番単純なのは既に別の方の回答にある通り、

置換前:[^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 14:37

-Daisuke.H-

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問