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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

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

Q&A

解決済

2回答

9252閲覧

sedの正規表現について

seel

総合スコア25

sed

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

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

0グッド

0クリップ

投稿2016/09/26 09:03

編集2016/09/26 10:42

教えてください。

linux の sed

sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

で 正規表現のことなのですが

全角と半角の

記号だけ
数字だけ
アルファベッドだけ

数字と記号だけ
数字とアルファベッドだけ
数字とアルファベッドと記号だけ

それぞれsedで指定するとどのような正規表現になりますか?
その正規表現にあたる範囲も正規表現で指定したいです。

sed 's/該当範囲と削除対象 //g'

該当範囲は指定htmlタグになります。

たとえば<h2></h2>内の指定対象を削除す場合は

sed 's/<h2>削除対象</h2>//g'

という感じのイメージです。

sedのオプションでparlのparlの正規表現
sed -E 's/<h2>削除対象</h2>//g' でもいいかと思います。

また、エスケープを回避するために

sed 's|<h2>削除対象</h2>||g'とした場合では正規表現部分は書き方が違ってきますでしょうか。

よろしくお願い致します。

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

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

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

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

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

ikedas

2016/09/26 10:19

sedにはいろいろな変種があります。またLinux固有のsedというものはありません。質問の前提として、どういうsedなのかを明記してください。たとえばGNU sedなどだと「sed --version」と実行すると詳細なバージョン情報が表示されることがあります。
seel

2016/09/26 12:25

ありがとうございます。 初めて自分がつかっているsedを確認しました。
guest

回答2

0

ベストアンサー

文字種を表す正規表現について

とりあえず、質問の前半に回答しますね。

次の前提で考えます。

  1. GNU sedを使う。
  2. POSIX準拠の機能だけ使う。拡張正規表現は使わない。GNU拡張仕様は原則として使わない。
    -- POSIXでのsedの仕様はこちら
    -- GNU sedのマニュアルはこちら
  3. 入出力の文字コードをUTF-8とする。
    -- マルチバイト文字の扱いが簡単なので、UTF-8にしておきます (ほかのShift_JISやEUC-JPなどの文字コードでも工夫すればできますが、そこは本題ではないので)。
    -- 当然、sedが実行するスクリプトもUTF-8で作成しなければなりません。

正規表現の書きかたとしては、(a) マッチングの対象をASCIIとその全角形に限定する場合と、(b) マルチバイト対応した場合とが考えられます。

(a) 対象をASCIIとその全角形に限定

sedを起動する際に次のようにしてCロケールの下で起動することで、マルチバイト対応を無効にします。

$ LANG=C sed -f スクリプトファイル 入力ファイル

特定の一文字を表す正規表現は次のように書けます。

数字だけ

([0-9]|0|1|2|3|4|5|6|7|8|9)

アルファベッドだけ

([A-Za-z]|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)

その他は略。

説明します。この場合、sedがマルチバイト文字を認識していないため、全角形の英数字や記号は各々が3バイトの文字列と認識されます。ですので [0-90-9] のように書いても意図した通りの結果にはなりません。選択の正規表現 (...|...|... ) を使って、あり得る文字をすべて列挙する必要があります。

(b) マルチバイト対応

sedを起動する際に次のようにして特定のロケールを指定することで、マルチバイト対応を有効にします。なお、ロケールの文字コードもUTF-8にしなければなりません。

$ LANG=ja_JP.UTF8 sed -f スクリプトファイル 入力ファイル

特定の一文字を表す正規表現は次のように書けます。

記号だけ

[[:punct:]]

数字だけ

[0-90-9]

英字だけ

[A-Za-zA-Za-z]

数字と記号だけ

[0-90-9[:punct:]]

数字と英字だけ

[0-9A-Za-z0-9A-Za-z]

数字と英字と記号だけ

[0-9A-Za-z0-9A-Za-z[:punct:]]

説明します。マルチバイト対応しており、日本語ロケールの文字を認識できるので、[...] の中に全角形の文字を書けます。

また[...] の中に書かれた [:punct:] はPOSIXの文字クラス式で、記号である文字を表します。ただし、文字クラス式がどんなものにマッチするかは、OS毎のロケールの実装によりますので、直感的には記号と思えないようなものがマッチする場合があるかもしれません。

他の文字クラス式を使うこともできます。たとえば私の環境 (CentOS 7.2) で日本語ロケール (ja_JP.UTF8) で確認したところ、[:alpha:] や [:alnum:] は全角形のラテン文字にもマッチするだけでなく、アクセント付きのラテン文字 (「À」など) にもマッチしてくれます。ただ、これらはキリル文字、ギリシャ文字、漢字にまでもマッチしまいましたした。要するに私の環境では、[:alpha:] は「数字や記号や空白でないもの」全般にマッチするようです。

また数字についても、[:digit:] という文字クラス式を使うことができます。ただし私の環境では、全角形の数字にマッチしませんでした。

投稿2016/09/27 03:27

ikedas

総合スコア4333

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

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

seel

2016/09/27 05:01

私の環境はcentos6.7でした。 なんだか簡単に考えすぎていたようです。 詳しく教えていただきありがとうございます。
guest

0

sedの(標準)正規表現、および-rまたは-Eオプション指定時の拡張正規表現の範囲だと、[ ]に囲んで列挙するしか無いでしょう。
Perl拡張正規表現が使えるツールだとすこし楽が出来ます。

なお、-Eオプションは拡張正規表現の指定で有り、Perl拡張ではありません。

投稿2016/09/26 15:55

otn

総合スコア84529

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

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

seel

2016/09/27 00:56

そうだったんですね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問