sed検索は大文字と小文字を区別しません。

sed検索は大文字と小文字を区別しません。

Unixスクリプトには次の行があります

sed -i "/$1/s/a/b" filename

これは、文字列$ 1(スクリプトの引数として提供されている)を含む行を見つけ、その行の「a」を「b」に置き換えます。

私は$ 1が大文字と小文字を区別しないことを望みます。たとえば、$ 1が「foo」の場合、「foo」、「FOO」、または「Foo」などを含むすべての行で置換が発生したいとします。これを行う最良の方法は何ですか?

(注:この記事の元のバージョンでは、コードの最初のスラッシュは省略されています。これはKusalaandaの答えを理解する上で重要なコンテキストです。)

ベストアンサー1

私はあなたの元のsed表現が対応する初期文字である/$1/s/a/b/か含まれていると仮定します。それ以外の場合は、最初の文字を含める必要があります(注:質問の表現は、この記事が書かれてから修正されました)。このコマンドは、最初の位置引数が提供する特定の正規表現でアドレス指定されたすべての行に置換を適用します。/$1/ s/a/b//$1/sed$1

GNUおよびmacOSsedで利用可能な実装の中には、フラグがコマンド(例:)で使用されるのと同じ方法で(大文字のi)フラグを使用して、正規表現アドレスを大文字と小文字を区別せずに一致させることができます。sedsedIs///s///g

sedこの非標準機能をサポートする機能を使用すると仮定すると、次のようになります。

sed "/$1/I s/a/b/" file

aこれにより、b最初の行は大文字と小文字を区別せず、$1正規表現に一致するすべての行に置き換えられます。

テスト:

% set -- foo ; sed "/$1/I s/a/b/" <<'EXAMPLE'
heredoc> FOO a
heredoc> a foo a
heredoc> Fool abba
heredoc> Moose able
heredoc> EXAMPLE
FOO b
b foo a
Fool bbba
Moose able

おすすめ記事