
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)フラグを使用して、正規表現アドレスを大文字と小文字を区別せずに一致させることができます。sed
sed
I
s///
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
答え2
わかりました。わかりました。仕事Is
より 。s
したがって、固定コードは次のようになります。
sed -i "/$1/Is/a/b" filename
(これはtシェルで動作します。まだテストしていません。)