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

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

ただいまの
回答率

88.63%

sed (GNU sed) 4.2.2の正規表現

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,106

seel

score 25

例えばhtml内に<h1></h1>タグがあるのですが

sample.html
<h1> Aa()かなカナ漢字123Aa()123カタカナ </h1>

<h1>

全角スペース
全角アルファベッド(大文字小文字)
全角記号
全角かな
全角カナ
全角漢字 
全角数字

半角アルファベッド (大文字小文字)
半角記号
半角数字
半角カタカナ
半角スペース

</h1>

が含まれているタグ内文字列があります。


やりたいことは

・全角スペースを半角スペースに変換
・全角アルファベッドを半角アルファベッドに変換 (大文字小文字) 
・全角記号を半角記号に変換
・全角数字を半角数字に変換
・半角カナを全角カナに変換

・ 全角かな 全角カナ 全角漢字 はそのまま。


結果

sample2.html
<h1> Aa123()かなカナ漢字</h1>


<h1>

半角スペース
半角アルファベッド (大文字小文字)
半角数字
半角記号

全角かな
全角カナ
全角漢字 

</h1>


そして半角スペースはそのままで

半角アルファベッド (大文字小文字) 
半角数字
半角記号

を削除したいです。


結果

sample3.html
<h1> かなカナ漢字</h1>


<h1>

半角スペースが残る
全角かな
全角カナ
全角漢字

</h1>


sed (GNU sed) 4.2.2を使って正規表現で
このようにするにはどうしたらいいでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

nkfという全角半角をうまくやってくれるコマンドがあるので、前半はsedでなくそれを使うと良いでしょう(よくあるニーズなのでそれにあったコマンドがある)。

・半角片仮名→全角片仮名
・全角英数字→半角英数字
・全角記号(同じ文字が半角にある物)→半角記号
・全角空白→半角空白
となります。対応する半角記号がない全角記号はそのままです(※とか)。
文字コードがutf-8だとすると、

nkf -Wwm0 -Z1 入力ファイル |    #上記変換
sed 's/[!-~]//g'                #半角記号・英数字の削除

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

GNU sedの実行のしかたについては以前のご質問の回答も参照してください。

  • 「記号」についてはどういうものを想定しているのかはっきりわからないので、以下の回答でははぶきます。

実際にスクリプトを書くときは、処理対象になる文字を文字種毎にもれなく書き出しておいてからはじめたほうがいいとおもいます。

 1. 文字種の変換

対象の文字をもれなく置換すればいいと思います。

GNU sedでマルチバイト文字処理が無効の場合:

s/0/0/g
s/1/1/g
…中略…
s/9/9/g
s/A/A/g
…中略…
s/Z/Z/g
…後略…

GNU sedでマルチバイト文字処理が有効の場合:

y/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/
 1.1. 文字毎の置換ですまない場合

半角形の片仮名については、濁点・半濁点の処理が必要なので文字毎の置き換えだけではできませんね。濁点・半濁点を含む置き換えをひとつひとつやってから、文字毎の置き換えをすればいいでしょう。

s/ガ/ガ/g
…中略…
s/ボ/ボ/g
s/パ/パ/g
…中略…
s/ポ/ポ/g
s/ヴ/ヴ/g
…このあと、残りの半角形の文字を文字毎に置き換え

 2. 文字種による削除

前の「文字種の変換」では「<h1>」や「</h1>」に含まれる文字は変換の対象でなかったので気にしなくてよかったのですが、今度は削除の対象となる文字が含まれるので気にしなければいけません。

たとえば次のようにすれば、「<h1>」や「</h1>」は残したまま、その間に現れる半角英数字を削除できそうです (繰り返しになりますが、半角の「記号」の削除処理ははぶいています)。

:loop
s|\(<h1>.*\)[0-9A-Za-z][0-9A-Za-z]*\(.*</h1>\)|\1\2|
tloop
  • 「:」、「t」の意味はsedのマニュアルを見て下さい。
  • 「s」については通常、パターンや置換結果の前後を「/」で囲みますが、ここでは「|」を使っています。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

出来なくはないですが、sed単体でやるレベルの話ではないと思います。
ひとまず仕様を整理すると

・全角スペース        →半角スペース        →残す
・全角アルファベッド  →半角アルファベッド   →削除
・全角記号           →半角記号            →削除
・全角数字           →半角数字            →削除 
・半角カナ           →全角カナ            →残す
・全角かな           →全角かな            →残す

ですので、まずは削除する系を走らせる。

・全角/半角アルファベットを削除

cat sed.txt | sed -e 's/[a-za-z]//ig'


・全角/半角数字を削除

cat sed.txt | sed -e 's/[0-90-9]//ig'


・全角/半角記号を削除

cat sed.txt | sed -e 's/[、-○]//ig'

で、変換系
・全角かな
※何もしない
・全角スペースを半角に

cat sed.txt | sed -e 's/ / /ig'


・半角カナを全角カナに

cat sed.txt | sed "s/ア/ア/ig"
cat sed.txt | sed "s/イ/イ/ig"
・・・

以上のような形で、多分できなくはないですが、やりたくない感じになりますね。。

半角→全角とかは、例えばpythonではmojimojiというライブラリがあって

mojimoji.han_to_zen(u'文字')


とすると、半角文字を全部全角にしてくれたりと簡単に実現できます。
シェルスクリプト内でpythonを呼び出したりすることも出来るので、そういった使い方を検討されると良いかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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