サイトアイコン スグブログ

【シェルスクリプト】sedで置換する方法!変数や正規表現も使用する

プログラミングスクール

シェルスクリプトでよく使うものに置換があります。「sed s」コマンドを使用しますが、書き方など難しいと思った事はないでしょうか?

記述の仕方が難しいのでとっつきにくく、今まで置換を避けてきたエンジニアの方も多いです。

そこで今回は現役エンジニアの筆者がsedの置換について例文付きでわかりやすくご説明いたします。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

変数や正規表現を使用しての置換などよく出てくるので、ここでやり方を抑えておきたいです。

シェルスクリプトのsedで置換する方法

シェルスクリプトで置換のsedの使い方の基礎は以下です。

sed 's/置き換え前/置き換え後/フラグ' ファイル名

sedで置換する基礎

置換のコマンド「sed s」コマンドとして覚えておきましょう!

/置換したい文字列/置換後の文字列/で指定します。

フラグは以下の2点を覚えておきましょう!2つ同時に指定する事もできます。

置換sedのフラグ2つ
  • g・・・全ての文字列が対象
  • i・・・大文字小文字を区別しない

フラグは何も指定しなければ各行の最初にマッチした文字列しか置換されません。全部置換したい時は「g」フラグを指定しましょう!

「i」フラグは大文字小文字を区別しなくなります。

実際にsedで置換してみる

では実際のシェルスクリプトで置換してみます。まずは置換前のファイルを表示します。

head -n 3 /etc/passwd

「head -n 3」は頭から3行まで表示するコマンドです。

このシェルスクリプトを実行します。

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

sedでこのファイルの「:」を空白に置換してみます。

sed s/://g /etc/passwd | head -n 3

「/etc/passwd」の全ての「:」を空白に置換するシェルスクリプトです。実行します。

rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin

全ての「:」が空白に置換されています。

シェルスクリプトのsedで指定した行を対象に置換する方法

置換対象の行数を指定したい場合もあると思います。

sed '行数s/置き換え前/置き換え後/フラグ' ファイル名

「s」の前に数字を付ける事で、対象行数を指定できます。

sed 2s/://g /etc/passwd | head -n 3

対象を2行目だけにしています。シェルスクリプトを実行します。

root:x:0:0:root:/root:/bin/bash
binx11bin/bin/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

2行目の「:」だけが空白に置換されています。

sed '2,5s/://g' /etc/passwd | head -n 7

2行目から5行目まで範囲指定したい場合は、「s」の前に「始まりの行数,終わりの行数」として指定できます。

root:x:0:0:root:/root:/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2行目から5行目までの「:」だけが空白に置換されています。

sedのフラグの使い方

setで置換する時の基礎は以下でした。フラグを試していきましょう!

sed 's/置き換え前/置き換え後/フラグ' ファイル名

フラグは以下の2点を覚えておきましょう!2つ同時に指定する事も可能。

置換sedのフラグ2つ
  • g・・・全ての文字列が対象
  • i・・・大文字小文字を区別しない

置換sedの「g」フラグを試す

sed s/:// /etc/passwd | head -n 3

フラグは何も指定しなければ各行の最初にマッチした文字列しか置換されません。

rootx:0:0:root:/root:/bin/bash
binx:1:1:bin:/bin:/sbin/nologin
daemonx:2:2:daemon:/sbin:/sbin/nologin

各行の初めの「:」だけが空白に置換されています。

「g」フラグをつけると行の先頭から末尾まで複数マッチした場合でも対象になります。

sed 's/://g' /etc/passwd | head -n 3

シェルスクリプトを実行して確認します。

rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin

各行全ての「:」が空白に置換されています。

置換sedの「i」フラグを試す

「i」フラグは大文字小文字を区別しなくなります。

sed 's/Root/user1/i' /etc/passwd | head -n 3

「Root」と「root」で大文字小文字が区別されない時しか置換できません。

user1:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

各行で初めの「root」の文字列が「user1」に置換されています。

sed 's/Root/user1/gi' /etc/passwd | head -n 3

「g」と「i」フラグを両方つけて実行します。

user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

各行のすべての「root」が「user1」に置換されました。

sedのエスケープシークエンスの使い方

「\」(バックスラッシュ)を使用してエスケープする

エスケープシークエンスとは特別な文字列の効果を消して、普通の文字として扱う事が出来る文字です。

sed 's/://g' /etc/passwd | head -n 3

「/etc/passwd」の「/」を「☆」に置換したいですが、sedでは「/」は特別な意味を持つ文字です。

sed 's/\//☆/g' /etc/passwd | head -n 3

変更前の「/」は区切りを表す特別な意味のある文字なので、その前に「\」(バックスラッシュ)をつけて効果を打ち消します。

root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin

特別な意味を持つ「/」が普通の文字として扱われて、☆に置換されました。

区切り文字を変更する

「/」を区切り文字として扱っていましたが、「%」や「!」で置き換えても大丈夫です。

sed 's%/%☆%g' /etc/passwd | head -n 3

区切り文字を「%」にして実行します。

root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin

普通に「/」が「☆」に置換されました。

sed 's!/!☆!g' /etc/passwd | head -n 3

同じく「!」を区切り文字にしているパターンです。

root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin

同じく普通に「/」が「☆」に置換されました。

sedのオプションの効果

sedで使用できるオプションをまとめます。

sedで使用できるオプション3選
  • -r ・・・拡張正規表現を使用する
  • -e ・・・複数の条件を指定する
  • -i ・・・ファイルを編集して上書きする

拡張正規表現を使用する「-r」オプション

正規表現については後述します。

複数の条件を指定する「-e」オプション

複数の置換条件がある場合に使用します。

sed -e 's/root/user1/g' -e 's/://g'  -e 's/\///g' /etc/passwd | head -n 3

「root」を「user1」に、「:」を空白に、「/」を空白に置換するシェルスクリプトです。

user1x00user1user1binbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin

「root」が「user1」に、「:」と「/」が空白に置換されています。

ファイルを編集して上書きする「-i」オプション

今までは標準出力に表示していただけで、ファイル自体の保存はできません。「-i」オプションを使用すればファイル自体を上書き保存できます。

シェルスクリプトと同階層に「sed_test.txt」があり内容が以下とします。

root:x:0:0:root:/root:/bin/bash

このファイルの文字列を置換して上書き保存します。元のファイルをバックアップする事も可能です。

sed -i -e 's/root/user1/g' -e 's/://g' sed_test.txt

「root」を「user1」に、「:」を空白に置換して上書き保存します。※バックアップはとりません。

user1x00user1/user1/bin/bash

「sed_test.txt」の内容を見ると上のようになっており、置換して上書き保存されています。

先程のコマンドではなく以下のように「-i」オプションの後すぐに名前を指定すればバックアップ出来ます。

sed -i.bk -e 's/root/user1/g' -e 's/://g' sed_test.txt

このシェルスクリプトを実行すると、同階層に「sed_test.txt」と「sed_test.txt.bk」ができています。それぞれの中身をみてみます。

user1x00user1/user1/bin/bash

「sed_test.txt」は置換されています。

root:x:0:0:root:/root:/bin/bash

「sed_test.txt.bk」は置換前のファイルの内容になっていて、バックアップがとれています。

sedで変数を使用して置換する方法

変数を使用して置換する方法も見ておきます。

moji=bin
sed "s/$moji/hensu/g" /etc/passwd | head -n 2

変数に値を入れています。sedの検索文字列に変数参照の「$変数」を入れて置換します。

root:x:0:0:root:/root:/hensu/bash
hensu:x:1:1:hensu:/hensu:/shensu/nologin

変数の「bin」の箇所が「hensu」に置換されています。

sedで変数を使用してエラーが出る時

変数で置換しようとして上手くいかない場合があります。

sed 's/$moji/hensu/g' /etc/passwd | head -n 2

このシェルスクリプトを実行します。

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

変数の文字列の「bin」が置換されていません。

原因は「”」ではなく「’」で囲っている為です。変数参照する時は「”」でなくては展開できません。

sedで正規表現を使用して置換する方法

シェルスクリプトでsedの正規表現

シェルスクリプト正規表現をよく使用するものに文字列検索する「grep」置換する「sed」があります。

sedでの正規表現についてまとめます。正規表現には基本正規表現と拡張正規表現があります。

基本的には拡張正規表現を使用していれば問題ありません。

正規表現で文字列を指定する特別な文字をメタ文字と言います。メタ文字がキーとなります。メタ文字とその効果をまとめます。

シェルスクリプトのsedで使用するメタ文字の種類
  • 文字を指定するメタ文字
  • 繰り返しを意味するメタ文字
  • 補助的メタ文字
基本正規表現メタ文字拡張正規表現メタ文字効果
..何かしらの1文字
^^最初の文字
$$最後の文字
[][]限定文字指定
[^][^]限定文字以外
シェルスクリプトで使用できる正規表現一覧

何かしらの文字列を表す「.」を使用します。

何かしらの文字列を表す「.」を使用します

sed 's/roo./user1/g' /etc/passwd | head -n 3

「| head -n 3」はsedの結果の頭3行のみを抽出するコマンドです。

指定したファイルの中に「roo」と何らかの1文字の文字列があれば「user1」に置換します。

「’」で文字列を囲わなくても抽出できますが、エラーになる指定の仕方もあるので、全て「’」で囲う事を推奨します。

user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

「roo」と何らかの文字の「t」が結合された「root」が置換られました。

最初の文字列を指定するには「^」を使用します。

最初の文字列を指定する場合です。

sed 's/^root/user1/g' /etc/passwd | head -n 3

指定したファイルの中で行の初めの「root」のみを「user1」に置換します。

user1:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

行の初めの「root」のみが「user1」に置換されました。

最後の文字を指定するには「$」を使用します。

最後の文字を指定する場合です。

sed 's/nologin$/user1/g' /etc/passwd | head -n 3

指定したファイルの中で行の終わりの「nologin」のみを置換します。

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/user1
daemon:x:2:2:daemon:/sbin:/sbin/user1

行終わりの「nologin」のみ「user1」に置換されました。

限定文字を指定するには[]を使用します。

限定文字を指定する場合です。

sed 's/roo[stu]/user1/g' /etc/passwd | head -n 3

指定したファイルの中で「roo」とあと「s」か「t」か「u」かで組み合わせる文字列があれば置換します。

user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

「root」が「user1」に置換られました。

sed 's/roo[s-u]/user1/g' /etc/passwd | head -n 3

続き文字列であれば上のように指定もできます。数字であれば[1-3]のようにも指定できます。

限定文字以外を指定するには[^]を使用します。

限定文字以外を指定する場合です。

sed 's/roo[^abc]/shellscript/g' /etc/passwd | head -n 3

指定したファイルの中で「roo」とあと「a」か「b」か「c」以外の文字で組み合わせる文字列があれば置換します。

shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

「root」が「shellscript」に置換されました。

次は繰り返しのメタ文字をまとめます。

基本正規表現メタ文字拡張正規表現メタ文字効果
**直前の文字の0回以上の繰り返し
無し+直前の文字の1回以上の繰り返し
無し?直前の文字の0回もしくは1回の繰り返し
\{m\}{m}直前の文字のm回の繰り返し
\{m,\}{m,}直前の文字のm回以上の繰り返し
\{m,n\}{m,n}直前の文字のm回以上n回以下の繰り返し
シェルスクリプトで使用できる繰り返しの正規表現一覧

直前の文字の0回以上の繰り返しするには「*」を使用します。

直前の文字の0回以上の繰り返しする場合です。拡張正規表現の場合は「-r」オプションを使用します。

echo 基本正規表現
sed 's/roo*t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現
sed -r 's/roo*t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「ro」とその後に「o」の0回以上の繰り返しがあり、その後に「t」が来る文字列を置換します。「rot」や「root」や「rooot」などが置換されます。

基本正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

どちらも「root」が「shellscript」に置換されました。

基本か拡張かであれば、拡張の方を使用する事を推奨します。

直前の文字の1回以上の繰り返しするには「+」を使用します。

直前の文字の1回以上の繰り返しする場合です。拡張正規表現のみ使用できます。

echo 基本正規表現
sed 's/roo+t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現
sed -r 's/roo+t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「ro」とその後に「o」の1回以上の繰り返しがあり、その後に「t」が来る文字列を置換します。「root」や「rooot」などが置換されます。今回「rot」などは対象外です。

基本正規表現
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

基本正規表現は対応していないので置換されず、拡張の方は「root」が「shellscript」に置換されました。

直前の文字の0回もしくは1回の繰り返しするには「?」を使用します。

直前の文字の0回もしくは1回の繰り返しする場合です。拡張正規表現のみ使用できます。

echo 基本正規表現
sed 's/ro?t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現1
sed -r 's/ro?t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現2
sed -r 's/roo?t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現3
sed -r 's/rooo?t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「r」、「ro」、「roo」とその後に「o」の0回か1回の繰り返しがあり、その後に「t」が来る文字列を置換してみます。

基本正規表現
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現2
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現3
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

拡張1は「rt」と「rot」、拡張2は「rot」と「root」、拡張3は「root」と「rooot」が抽出されます。

基本正規表現は対応していないので置換されず、拡張1は「rt」や「rot」がないので置換されず、拡張2と3は「root」が「shellscript」に置換されました。

直前の文字のm回の繰り返しするには{m}を使用します。

直前の文字の繰り返し回数を指定する場合です。基本正規表現を使用したい場合は「{」や「}」の前に「\」を付けます。

echo 基本正規表現
sed 's/ro\{2\}t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現
sed -r 's/ro{2}t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「ro」とその後に「o」の2回のみの繰り返しがあり、その後に「t」が来る文字列を置換します。「root」が置換されます。「rooot」や「roooot」などは対象外です。

基本正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

どちらも「root」が「shellscript」に置換されました。

直前の文字のm回以上の繰り返しするには{m,}を使用します。

直前の文字の繰り返し回数以上を指定する場合です。基本正規表現を使用したい場合は「{」や「}」の前に「\」を付けます。

echo 基本正規表現
sed 's/ro\{2,\}t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現
sed -r 's/ro{2,}t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「ro」とその後に「o」の2回以上の繰り返しがあり、その後に「t」が来る文字列を置換します。「root」や「rooot」や「roooot」などが置換されます。

基本正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

どちらも「root」が「「shellscript」に置換されました。

直前の文字のm回以上n回以下の繰り返しするには{m,n}を使用します。

直前の文字の繰り返し回数以上と以下を指定する場合です。基本正規表現を使用したい場合は「{」や「}」の前に「\」を付けます。

echo 基本正規表現
sed 's/ro\{2,3\}t/shellscript/g' /etc/passwd | head -n 2
echo 拡張正規表現
sed -r 's/ro{2,3}t/shellscript/g' /etc/passwd | head -n 2

指定したファイルの中で「ro」とその後に「o」の2回以上3回以下の繰り返しがあり、その後に「t」が来る文字列を置換します。「root」や「rooot」が置換されます。「roooot」などは対象外です。

基本正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

どちらも「root」が「shellscript」に置換されました。

最後に補助的なメタ文字をご紹介します。

文字列指定の補助的なメタ文字をまとめます。

基本正規表現メタ文字拡張正規表現メタ文字効果
\\直後のメタ文字を普通の文字として扱う
\(\)()指定する文字列をクループ化する
無し|複数の正規表現をORで繋げる
シェルスクリプトで使用できる補助的正規表現一覧

補助的なメタ文字を試すにあたり環境を説明します。シェルスクリプトと同階層に「6_sed」というディレクトリがあり、その配下に「sed_test.txt」があるとします。

「sed_test2.txt」の内容は以下とします。

ro\{2\}t
root
abcc
abcbc
abcbcbc
123
12323
1232323
123123123
12333
abcabcabc

直後のメタ文字を普通の文字として扱うには「\」を使用します。

直後のメタ文字を普通の文字として扱う場合です。基本正規表現と拡張正規表現とどちらも使用できます。

echo 基本正規表現1 繰り返し
sed 's/ro\{2\}t/shellscript/g' 6_sed/sed_test2.txt | head -n 2

echo 基本正規表現2 直後のメタ文字を普通の文字として扱う
sed 's/ro\\{2\\}t/shellscript/g' 6_sed/sed_test2.txt | head -n 2

echo 拡張正規表現1 変化なし
sed -r 's/ro\{2\}t/shellscript/g' 6_sed/sed_test2.txt | head -n 2

echo 拡張正規表現2 直後のメタ文字を普通の文字として扱う
sed -r 's/ro\\\{2\\\}t/shellscript/g' 6_sed/sed_test2.txt | head -n 2

指定したファイルの中で「ro\{2\}t」という文字列を置換したいです。しかし「ro\{2\}t」は繰り返しで出てきたoを2回繰り返すメタ文字で「root」が置き換わります。

このままでは「root」が抽出されるので「\」を「\」で普通の文字列にエスケープします。これで「ro\{2\}t」という文字列が置換できます。

拡張正規表現においては「ro\{2\}t」の「\」はメタ文字と解釈されているので変化なしで置換されません。

「ro\{2\}t」の「\」と「{」と「}」を「\」で普通の文字列にエスケープします。これで拡張正規表現の方も「ro\{2\}t」という文字列が置換できます。

基本正規表現1 繰り返し
ro\{2\}t
shellscript
基本正規表現2 直後のメタ文字を普通の文字として扱う
shellscript
root
拡張正規表現1 変化なし
ro\{2\}t
root
拡張正規表現2 直後のメタ文字を普通の文字として扱う
shellscript
root

基本正規表現は「ro\\{2\\}t」拡張正規表現は「ro\\\{2\\\}t」とすることで「ro\{2\}t」という文字列が「shellscript」に置換されました。

指定する文字列をクループ化して扱うには()を使用します。

指定する文字列をクループ化して扱う場合です。基本正規表現と拡張正規表現とどちらも使用できます。

echo 基本正規表現1 単体文字繰り返し
sed 's/abc\{2\}/shellscript/g' 6_sed/sed_test2.txt | head -n 5

echo 基本正規表現2 グループで繰り返し
sed 's/a\(bc\)\{2\}/shellscript/g' 6_sed/sed_test2.txt | head -n 5

echo 拡張正規表現1 単体文字繰り返し
sed -r 's/abc{2}/shellscript/g' 6_sed/sed_test2.txt | head -n 5

echo 拡張正規表現2 グループで繰り返し
sed -r 's/a(bc){2}/shellscript/g' 6_sed/sed_test2.txt | head -n 5

基本正規表現1は指定したファイルの中で「abc」の一つ前の「c」を2回繰り返すというシェルスクリプトでした。しかし「bc」の繰り返しにしたい場合は、基本正規表現2のように該当文字列を\(\)で囲いグループ化します。

拡張正規表現1も同様です。「bc」の繰り返しにしたい場合は、拡張正規表現2のように該当文字列を()で囲いグループ化します。

基本正規表現1 単体文字繰り返し
ro\{2\}t
root
shellscript
abcbc
abcbcbc
基本正規表現2 グループで繰り返し
ro\{2\}t
root
abcc
shellscript
shellscriptbc
拡張正規表現1 単体文字繰り返し
ro\{2\}t
root
shellscript
abcbc
abcbcbc
拡張正規表現2 グループで繰り返し
ro\{2\}t
root
abcc
shellscript
shellscriptbc

どちらの1も「abcc」が、どちらの2も「abcbc」が「shellscript」に置換されました。

複数の正規表現をORで繋げるには「|」を使用します。

複数の正規表現をORで繋げる場合です。拡張正規表現しか対応していません。

指定したファイルの中で「abc」か「123」という文字列を置換したいです。

echo 拡張正規表現1
sed -r 's/abc|123/shellscript/g' 6_sed/sed_test2.txt

「abc|123」で可能です。シェルスクリプトを実行します。

拡張正規表現1
ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
shellscript
shellscript23
shellscript2323
shellscriptshellscriptshellscript
shellscript33
shellscriptshellscriptshellscript

指定したファイルの中で「abc」か「123」という文字列をが「shellscript」に置換されました。

ではここで質問です。

したのシェルスクリプトを実行すると置換結果はどのようになるでしょうか?

sed -r ‘s/abc|123{3}/shellscript/g’ 6_sed/sed_test2.txt
ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
123
12323
1232323
123123123
shellscript
shellscriptshellscriptshellscript
sed -r ‘s/abc|(123){3}/shellscript/g’ 6_sed/sed_test2.txt
ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
123
12323
1232323
shellscript
12333
shellscriptshellscriptshellscript
sed -r ‘s/(abc|123){3}/shellscript/g’ 6_sed/sed_test2.txt
ro\{2\}t
root
abcc
abcbc
abcbcbc
123
12323
1232323
shellscript
12333
shellscript
管理人

シェルスクリプトのsedでの置換は非常によく使用するので、このページを何度も読んで是非マスターしてください。

モバイルバージョンを終了