Q&A
不特定多数の文字列の中から数字のみ抜き出すシェルスクリプトを書こうとしています。
例 : hoge123moge > 123 のみ抽出、hoge や moge は不特定。
この場合、以下のようになると考えたのですが、すべて出力されてしまいます。
echo "hoge123moge" | sed -e 's/^*\(\[0-9\]*\)$/\1/g' hoge123moge
どのように修正すれば数字のみ出力できるか、教えていただければ幸いです。
どうぞ、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答4件
4
sed の練習が目的でなければ、その目的に最適なのは grep です。
grep -o '[0-9]*'
ただし、数字ごとに改行されます。
abc123def456ghi のような1行に数字が複数あるデータの場合はどうしたいでしょうか?
投稿2015/08/26 10:11
総合スコア81791
3
これでどうですか?
単なる思い付きで動作確認も出来ていませんが、数字以外を削除するという意味です。
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総合スコア5936
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
2
+ の箇所と、前の方がご説明されておられる、 .* の箇所がまずかったようです。
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
総合スコア1768
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
2
注意:話を簡単にするため、実行環境都合によるエスケープ""は一旦無視し、あくまで正規表現上の話に限定します。
不特定多数の文字列の中から数字のみ抜き出すシェルスクリプトを書こうとしています。
やり方は幾つかあると思いますが、一番単純なのは既に別の方の回答にある通り、
置換前:[^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
総合スコア15
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
受付中
sedで数字のみ抜き出す
回答4
クリップ2
更新
2022/01/12
Q&A
解決済
PDOでユーザの誤りによりMySQLにアクセスできない
回答1
クリップ0
更新
2023/05/11
Q&A
解決済
sedコマンド:特定の文字列以降を削除する方法
回答1
クリップ0
更新
2020/11/02
Q&A
解決済
特定の文字の後の文字列を抜き出したい。
回答3
クリップ0
更新
2021/01/11
Q&A
解決済
Dockerfileでシェルスクリプトファイルの実行
回答2
クリップ0
更新
2021/05/04
Q&A
解決済
Centos6.7 で yum をすると[Errno 14] problem making ssl connectionとなる
回答1
クリップ1
更新
2022/01/21
Q&A
解決済
jQueryによるアコーディオンパネルについて教えて欲しいです。
回答1
クリップ0
更新
2023/04/20
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。