1. ホーム
  2. macos

[解決済み] sedによる大文字小文字を区別しない検索と置換

2023-02-13 11:36:59

質問

SED を使って、ログファイルからテキストを抽出しようとしています。検索と置換はそれほど問題なくできるのですが。

sed 's/foo/bar/' mylog.txt

しかし、大文字小文字を区別せずに検索したいのです。ググってみると、どうやら i をコマンドの末尾につけるとうまくいきそうです。

sed 's/foo/bar/i' mylog.txt

しかし、これではエラーメッセージが表示されます。

sed: 1: "s/foo/bar/i": bad flag in substitute command: 'i'

何が問題なのか、どうすれば解決できるのか?

どのように解決するのですか?

更新 : で始まる macOS Big Sur (11.0) , sed 現在 はする をサポートしています。 I フラグを使用して大文字小文字を区別しないマッチングを行います。 をサポートしているので、質問のコマンドは現在動作するはずです (BSD の sed はそのバージョンを報告しませんが、あなたは man ページの一番下にある日付で判断できます。 March 27, 2017 またはもっと新しいものであるべきです); 簡単な例です。

# BSD sed on macOS Big Sur and above (and GNU sed, the default on Linux)
$ sed 's/ö/@/I' <<<'FÖO'
F@O   # `I` matched the uppercase Ö correctly against its lowercase counterpart

注意 I (大文字) はフラグの文書化された形式ですが i も同様に動作します。

同様に macOS ビッグサー (11.0) awk 現在 ロケールアウェア ( awk --version を報告する必要があります。 20200816 またはもっと新しい)。

# BSD awk on macOS Big Sur and above (and GNU awk, the default on Linux)
$ awk 'tolower($0)' <<<'FÖO'
föo  # non-ASCII character Ö was properly lowercased


以下が該当します。 macOS Catalina まで (10.15) :

はっきり言って、macOS では sed - であり、これは BSD の実装ですが、大文字小文字を区別しないマッチングをサポートしていません。 - 信じがたいことですが、本当です。その は以前は を示すもので、それ自体が GNU sed コマンドのおかげで、その地位を獲得しました。 perl -をベースにした解決策がコメントで言及されたためです。

を作るために、その Perl ソリューション で動作します。 外字 も、UTF-8経由で、以下のように使用します。

perl -C -Mutf8 -pe 's/öœ/oo/i' <<< "FÖŒ" # -> "Foo"

  • -C は、現在のロケールが UTF-8 ベースであると仮定して、 ストリームとファイルに対する UTF-8 サポートを有効にします。
  • -Mutf8 はPerlに ソースコード をUTF-8として解釈します。 -pe に渡される文字列) - これは、より冗長な -e 'use utf8;'. ありがとうございます。 マーク・リード

(ただし を使って awk もオプションではありません。 のように awk を macOS で使用する(つまり。 BWK awk BSD awk ) はロケールを全く意識していないようで、その tolower()toupper() 関数は外字を無視します(そして sub() / gsub() はそもそも大文字小文字を区別しないフラグを持っていません)。


の関係についてのメモです。 sedawk を POSIX 標準に変換します。

BSD sed そして awk は機能を制限する ほとんど POSIX sed そして POSIX awk の仕様が義務付けられているのに対し、GNU の対応するものはより多くの拡張を実装しています。