<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sed &#8211; スグブログ</title>
	<atom:link href="https://sugublog.org/tag/sed/feed/" rel="self" type="application/rss+xml" />
	<link>https://sugublog.org</link>
	<description>ブログ運営について発信中</description>
	<lastBuildDate>Mon, 11 Mar 2024 16:34:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://sugublog.org/wp-content/uploads/2021/07/icon_20210703-min-150x150.png</url>
	<title>sed &#8211; スグブログ</title>
	<link>https://sugublog.org</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【シェルスクリプト】sedで置換する方法！変数や正規表現も使用する</title>
		<link>https://sugublog.org/shellscript-sed/</link>
					<comments>https://sugublog.org/shellscript-sed/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[suguru]]></dc:creator>
		<pubDate>Mon, 11 Mar 2024 16:34:49 +0000</pubDate>
				<category><![CDATA[シェルスクリプト]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[shellscript]]></category>
		<guid isPermaLink="false">https://sugublog.org/?p=6506</guid>

					<description><![CDATA[<p><img src="https://sugublog.org/wp-content/uploads/2021/11/programing_1122-4-1024x560.jpg" class="webfeedsFeaturedVisual" /></p>シェルスクリプトでよく使うものに置換があります。「sed s」コマンドを使用しますが、書き方など難しいと思った事はないでしょうか？ 記述の仕方が難しいのでとっつきにくく、今まで置換を避けてきたエンジニアの方も多いです。  [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://sugublog.org/wp-content/uploads/2021/11/programing_1122-4-1024x560.jpg" class="webfeedsFeaturedVisual" /></p>
<p>シェルスクリプトでよく使うものに<strong><span class="swl-inline-color has-swl-deep-01-color">置換</span></strong>があります。<strong><span class="swl-inline-color has-swl-deep-01-color">「sed s」コマンド</span></strong>を使用しますが、書き方など難しいと思った事はないでしょうか？</p>



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



<p>そこで今回は現役エンジニアの筆者が<span class="swl-marker mark_orange"><strong><span class="swl-inline-color has-swl-deep-01-color">sedの置換について例文付きでわかりやすく</span></strong>ご説明いたします。</span></p>


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


<p><strong><span class="swl-inline-color has-swl-deep-01-color">変数や正規表現を使用しての置換</span></strong>などよく出てくるので、ここでやり方を抑えておきたいです。</p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle ads" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9330904718533231" data-ad-slot="6086594686"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2 class="wp-block-heading">シェルスクリプトのsedで置換する方法</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="620" src="https://sugublog.org/wp-content/uploads/2021/07/PC007-8-1024x620.jpg" alt="置換" class="wp-image-3717" srcset="https://sugublog.org/wp-content/uploads/2021/07/PC007-8-1024x620.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/07/PC007-8-300x182.jpg 300w, https://sugublog.org/wp-content/uploads/2021/07/PC007-8-768x465.jpg 768w, https://sugublog.org/wp-content/uploads/2021/07/PC007-8.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p><strong><span class="swl-inline-color has-swl-deep-01-color">シェルスクリプトで置換のsedの使い方の基礎</span></strong>は以下です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/置き換え前/置き換え後/フラグ&#39; ファイル名</code></pre></div>



<h3 class="wp-block-heading">sedで置換する基礎</h3>



<p><strong>置換のコマンド</strong>は<strong><span class="swl-inline-color has-swl-deep-01-color">「sed s」</span></strong>コマンドとして覚えておきましょう！</p>



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



<p>フラグは以下の2点を覚えておきましょう！<span class="swl-marker mark_green">2つ同時に指定する事もできます。</span></p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>置換sedのフラグ２つ</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>g・・・全ての文字列が対象</li>



<li>i・・・大文字小文字を区別しない</li>
</ul>
</div></div>



<p>フラグは何も指定しなければ<span class="swl-marker mark_yellow">各行の最初にマッチした文字列しか置換されません。</span><span class="swl-marker mark_orange">全部置換したい時は「g」フラグを指定しましょう！</span></p>



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



<h3 class="wp-block-heading">実際にsedで置換してみる</h3>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>head -n 3 /etc/passwd</code></pre></div>



<p class="is-style-icon_book">「head -n 3」は頭から3行まで表示するコマンドです。</p>



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


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type1" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://sugublog.org/wp-content/uploads/2021/08/script_0809-2-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://sugublog.org/shell-script-execution/">【シェルスクリプト基礎】コマンドを実行する様々な方法をご紹介！</a>
						<span class="p-blogCard__excerpt">シェルスクリプトを実行する時に困った事はありませんか？ シェルスクリプトのコマンド実行での失敗メッセージ一覧 「実行権限がありません」 「コマンドが見つかりませ&#8230;</span>					</div>
				</div>
			</div>
		</div>


<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed s/://g /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin</code></pre></div>



<p class="has-border -border01">全ての「:」が空白に置換されています。</p>



<h2 class="wp-block-heading">シェルスクリプトのsedで指定した行を対象に置換する方法</h2>



<p><strong><span class="swl-inline-color has-swl-deep-01-color">置換対象の行数を指定</span></strong>したい場合もあると思います。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;行数s/置き換え前/置き換え後/フラグ&#39; ファイル名</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed 2s/://g /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:/root:/bin/bash
binx11bin/bin/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01"><strong><span class="swl-inline-color has-swl-deep-01-color">2行目</span></strong>の「:」だけが空白に<span class="swl-inline-color has-swl-deep-01-color">置換</span>されています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;2,5s/://g&#39; /etc/passwd | head -n 7</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>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</code></pre></div>



<p class="has-border -border01"><span class="swl-inline-color has-swl-deep-01-color">2行目から5行目まで</span>の「:」だけが空白に<span class="swl-inline-color has-swl-deep-01-color">置換</span>されています。</p>



<h2 class="wp-block-heading">sedのフラグの使い方</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="682" src="https://sugublog.org/wp-content/uploads/2021/11/DB_1114-5-1024x682.jpg" alt="フラグ" class="wp-image-4502" srcset="https://sugublog.org/wp-content/uploads/2021/11/DB_1114-5-1024x682.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-5-300x200.jpg 300w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-5-768x511.jpg 768w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-5.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/置き換え前/置き換え後/フラグ&#39; ファイル名</code></pre></div>



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



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>置換sedのフラグ２つ</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>g・・・全ての文字列が対象</li>



<li>i・・・大文字小文字を区別しない</li>
</ul>
</div></div>



<h3 class="wp-block-heading">置換sedの「g」フラグを試す</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed s/:// /etc/passwd | head -n 3</code></pre></div>



<p>フラグは何も指定しなければ<span class="swl-marker mark_yellow">各行の最初にマッチした文字列しか置換されません。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>rootx:0:0:root:/root:/bin/bash
binx:1:1:bin:/bin:/sbin/nologin
daemonx:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">各行の初めの「:」だけが空白に置換されています。</p>



<p><span class="swl-marker mark_orange">「g」フラグをつけると行の先頭から末尾まで複数マッチした場合でも対象になります。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/://g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin</code></pre></div>



<p class="has-border -border01">各行全ての「:」が空白に置換されています。</p>



<h3 class="wp-block-heading">置換sedの「i」フラグを試す</h3>



<p>「i」フラグは<span class="swl-marker mark_orange">大文字小文字を区別しなくなります。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/Root/user1/i&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">各行で<span class="swl-inline-color has-swl-deep-01-color">初めの「root」の文字列</span>が「user1」に置換されています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/Root/user1/gi&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p>各行の<span class="swl-inline-color has-swl-deep-01-color">すべての「root」</span>が「user1」に置換されました。</p>



<h2 class="wp-block-heading">sedのエスケープシークエンスの使い方</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="444" src="https://sugublog.org/wp-content/uploads/2021/11/DB_1114-7-1024x444.jpg" alt="エスケープシークエンス" class="wp-image-4503" srcset="https://sugublog.org/wp-content/uploads/2021/11/DB_1114-7-1024x444.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-7-300x130.jpg 300w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-7-768x333.jpg 768w, https://sugublog.org/wp-content/uploads/2021/11/DB_1114-7.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h3 class="wp-block-heading">「\」（バックスラッシュ）を使用してエスケープする</h3>



<p><span class="swl-marker mark_orange"><span class="swl-inline-color has-swl-deep-01-color">エスケープシークエンス</span>とは特別な文字列の効果を消して、普通の文字として扱う事が出来る文字です。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/://g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/\//☆/g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin</code></pre></div>



<p class="has-border -border01">特別な意味を持つ「/」が普通の文字として扱われて、☆に置換されました。</p>



<h3 class="wp-block-heading">区切り文字を変更する</h3>



<p>「/」を<span class="swl-inline-color has-swl-deep-01-color">区切り文字</span>として扱っていましたが、<span class="swl-marker mark_orange">「%」や「!」で置き換えても大丈夫です。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s%/%☆%g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin</code></pre></div>



<p class="has-border -border01">普通に「/」が「☆」に置換されました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s!/!☆!g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:☆root:☆bin☆bash
bin:x:1:1:bin:☆bin:☆sbin☆nologin
daemon:x:2:2:daemon:☆sbin:☆sbin☆nologin</code></pre></div>



<p class="has-border -border01">同じく普通に「/」が「☆」に置換されました。</p>



<h2 class="wp-block-heading">sedのオプションの効果</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="717" src="https://sugublog.org/wp-content/uploads/2021/10/uninstall_20211010-1-1024x717.jpg" alt="オプション" class="wp-image-4270" srcset="https://sugublog.org/wp-content/uploads/2021/10/uninstall_20211010-1-1024x717.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/10/uninstall_20211010-1-300x210.jpg 300w, https://sugublog.org/wp-content/uploads/2021/10/uninstall_20211010-1-768x538.jpg 768w, https://sugublog.org/wp-content/uploads/2021/10/uninstall_20211010-1.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p><strong><span class="swl-inline-color has-swl-deep-01-color">sedで使用できるオプション</span></strong>をまとめます。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>sedで使用できるオプション3選</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>-r　・・・拡張正規表現を使用する</li>



<li>-e　・・・複数の条件を指定する</li>



<li>-i　・・・ファイルを編集して上書きする</li>
</ul>
</div></div>



<h3 class="wp-block-heading">拡張正規表現を使用する「-r」オプション</h3>



<p class="is-style-icon_book">正規表現については後述します。</p>



<h3 class="wp-block-heading">複数の条件を指定する「-e」オプション</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">複数の置換条件</span>がある場合に使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed -e &#39;s/root/user1/g&#39; -e &#39;s/://g&#39;  -e &#39;s/\///g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1x00user1user1binbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin</code></pre></div>



<p class="has-border -border01">「root」が「user1」に、「:」と「/」が空白に置換されています。</p>



<h3 class="wp-block-heading">ファイルを編集して上書きする「-i」オプション</h3>



<p>今までは標準出力に表示していただけで、<span class="swl-marker mark_yellow">ファイル自体の保存はできません。</span>「-i」オプションを使用すれば<span class="swl-bg-color has-swl-deep-01-background-color">ファイル自体を上書き保存できます。</span></p>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="sed_test.txt"><code>root:x:0:0:root:/root:/bin/bash</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed -i -e &#39;s/root/user1/g&#39; -e &#39;s/://g&#39; sed_test.txt</code></pre></div>



<p>「root」を「user1」に、「:」を空白に置換して上書き保存します。<span class="swl-bg-color has-swl-deep-01-background-color">※バックアップはとりません。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="sed_test.txt"><code>user1x00user1/user1/bin/bash</code></pre></div>



<p class="has-border -border01">「sed_test.txt」の内容を見ると上のようになっており、<span class="swl-inline-color has-swl-deep-01-color">置換して上書き保存</span>されています。</p>



<p>先程のコマンドではなく以下のように<span class="swl-marker mark_orange">「-i」オプションの後すぐに名前を指定すれば<span class="swl-inline-color has-swl-deep-01-color">バックアップ出来ます。</span></span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed -i.bk -e &#39;s/root/user1/g&#39; -e &#39;s/://g&#39; sed_test.txt</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="sed_test.txt"><code>user1x00user1/user1/bin/bash</code></pre></div>



<p>「sed_test.txt」は置換されています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="sed_test.txt.bk"><code>root:x:0:0:root:/root:/bin/bash</code></pre></div>



<p><span class="swl-marker mark_green">「sed_test.txt.bk」は置換前のファイルの内容になっていて、<span class="swl-bg-color has-swl-deep-03-background-color">バックアップがとれています。</span></span></p>



<h2 class="wp-block-heading">sedで変数を使用して置換する方法</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="666" src="https://sugublog.org/wp-content/uploads/2021/08/script_0809-11-1024x666.jpg" alt="スクリプト" class="wp-image-3868" srcset="https://sugublog.org/wp-content/uploads/2021/08/script_0809-11-1024x666.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/08/script_0809-11-300x195.jpg 300w, https://sugublog.org/wp-content/uploads/2021/08/script_0809-11-768x499.jpg 768w, https://sugublog.org/wp-content/uploads/2021/08/script_0809-11.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p><strong><span class="swl-inline-color has-swl-deep-01-color">変数を使用して置換する方法</span></strong>も見ておきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>moji=bin
sed &quot;s/$moji/hensu/g&quot; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:/root:/hensu/bash
hensu:x:1:1:hensu:/hensu:/shensu/nologin</code></pre></div>



<p class="has-border -border01">変数の「bin」の箇所が「hensu」に置換されています。</p>



<h3 class="wp-block-heading">sedで変数を使用してエラーが出る時</h3>



<p class="is-style-big_icon_caution">変数で置換しようとして上手くいかない場合があります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/$moji/hensu/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin</code></pre></div>



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



<p class="has-border -border02">原因は「&#8221;」ではなく「&#8217;」で囲っている為です。変数参照する時は「&#8221;」でなくては展開できません。</p>



<h2 class="wp-block-heading">sedで正規表現を使用して置換する方法</h2>



<div class="wp-block-cover aligncenter"><span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span><img decoding="async" width="1024" height="576" class="wp-block-cover__image-background wp-image-4184" alt="code" src="https://sugublog.org/wp-content/uploads/2021/09/code_0923-4-1024x576.jpg" data-object-fit="cover" srcset="https://sugublog.org/wp-content/uploads/2021/09/code_0923-4-1024x576.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/09/code_0923-4-300x169.jpg 300w, https://sugublog.org/wp-content/uploads/2021/09/code_0923-4-768x432.jpg 768w, https://sugublog.org/wp-content/uploads/2021/09/code_0923-4.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<p class="has-text-align-center has-large-font-size"></p>



<p class="has-text-align-center"><span class="swl-fz u-fz-xl">シェルスクリプトでsedの正規表現</span></p>
</div></div>



<p><span class="swl-marker mark_orange"><strong>シェルスクリプト</strong>で<strong>正規表現</strong>をよく使用するものに<strong>文字列検索する「grep」</strong>と<strong><span class="swl-inline-color has-swl-deep-01-color">置換する「sed」</span></strong>があります。</span></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type1" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://sugublog.org/wp-content/uploads/2021/12/PC教室20211216-6-300x250.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://sugublog.org/shellscript-grep/">【シェルスクリプト】grepで文字列を抽出する方法！正規表現も使用します</a>
						<span class="p-blogCard__excerpt">Linuxでシェルスクリプトのgrepのやり方がよくわかりません。オプションや正規表現を使用した文字列抽出を行いたいです。 そういった声が多いので今回はシェルスクリプ&#8230;</span>					</div>
				</div>
			</div>
		</div>


<p><strong><span class="swl-inline-color has-swl-deep-01-color">sedでの正規表現</span></strong>についてまとめます。正規表現には基本正規表現と拡張正規表現があります。</p>



<p class="is-style-big_icon_point">基本的には<strong>拡張正規表現</strong>を使用していれば問題ありません。</p>



<p>正規表現で文字列を指定する<strong><span class="swl-inline-color has-swl-deep-01-color">特別な文字をメタ文字</span></strong>と言います。メタ文字がキーとなります。メタ文字とその効果をまとめます。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>シェルスクリプトのsedで使用するメタ文字の種類</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>文字を指定するメタ文字</li>



<li>繰り返しを意味するメタ文字</li>



<li>補助的メタ文字</li>
</ul>
</div></div>



<figure class="wp-block-table"><table><thead><tr><th>基本正規表現メタ文字</th><th>拡張正規表現メタ文字</th><th>効果</th></tr></thead><tbody><tr><td>.</td><td>.</td><td>何かしらの1文字</td></tr><tr><td>^</td><td>^</td><td>最初の文字</td></tr><tr><td>$</td><td>$</td><td>最後の文字</td></tr><tr><td>[]</td><td>[]</td><td>限定文字指定</td></tr><tr><td>[^]</td><td>[^]</td><td>限定文字以外</td></tr></tbody></table><figcaption class="wp-element-caption">シェルスクリプトで使用できる正規表現一覧</figcaption></figure>



<h3 class="wp-block-heading">何かしらの文字列を表す「.」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">何かしらの文字列を表す「.」を使用します</span>。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/roo./user1/g&#39; /etc/passwd | head -n 3</code></pre></div>



<p class="is-style-icon_book">「| head -n 3」はsedの結果の頭３行のみを抽出するコマンドです。</p>



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



<p class="is-style-big_icon_point">「&#8217;」で文字列を囲わなくても抽出できますが、エラーになる指定の仕方もあるので、全て「&#8217;」で囲う事を推奨します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">「roo」と何らかの文字の「t」が結合された「root」が置換られました。</p>



<h3 class="wp-block-heading">最初の文字列を指定するには「^」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">最初の文字列を指定する</span>場合です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/^root/user1/g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">行の初めの「root」のみが「user1」に置換されました。</p>



<h3 class="wp-block-heading">最後の文字を指定するには「$」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">最後の文字を指定する</span>場合です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/nologin$/user1/g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/user1
daemon:x:2:2:daemon:/sbin:/sbin/user1</code></pre></div>



<p class="has-border -border01">行終わりの「nologin」のみ「user1」に置換されました。</p>



<h3 class="wp-block-heading">限定文字を指定するには[]を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">限定文字を指定する</span>場合です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/roo[stu]/user1/g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>user1:x:0:0:user1:/user1:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">「root」が「user1」に置換られました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/roo[s-u]/user1/g&#39; /etc/passwd | head -n 3</code></pre></div>



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



<h3 class="wp-block-heading">限定文字以外を指定するには[^]を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">限定文字以外を指定する</span>場合です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sed &#39;s/roo[^abc]/shellscript/g&#39; /etc/passwd | head -n 3</code></pre></div>



<p>指定したファイルの中で「roo」とあと「a」か「b」か「c」<span class="swl-inline-color has-swl-deep-01-color">以外</span>の文字で組み合わせる文字列があれば置換します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre></div>



<p class="has-border -border01">「root」が「shellscript」に置換されました。</p>



<p class="is-style-icon_info">次は繰り返しのメタ文字をまとめます。</p>



<figure class="wp-block-table"><table><thead><tr><th>基本正規表現メタ文字</th><th>拡張正規表現メタ文字</th><th>効果</th></tr></thead><tbody><tr><td>*</td><td>*</td><td>直前の文字の0回以上の繰り返し</td></tr><tr><td>無し</td><td>+</td><td>直前の文字の1回以上の繰り返し</td></tr><tr><td>無し</td><td>?</td><td>直前の文字の0回もしくは1回の繰り返し</td></tr><tr><td>\{m\}</td><td>{m}</td><td>直前の文字のm回の繰り返し</td></tr><tr><td>\{m,\}</td><td>{m,}</td><td>直前の文字のm回以上の繰り返し</td></tr><tr><td>\{m,n\}</td><td>{m,n}</td><td>直前の文字のm回以上n回以下の繰り返し</td></tr></tbody></table><figcaption class="wp-element-caption">シェルスクリプトで使用できる繰り返しの正規表現一覧</figcaption></figure>



<h3 class="wp-block-heading">直前の文字の0回以上の繰り返しするには「*」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の0回以上の繰り返しする</span>場合です。拡張正規表現の場合は「-r」オプションを使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/roo*t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現
sed -r &#39;s/roo*t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
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</code></pre></div>



<p class="has-border -border01">どちらも「root」が「shellscript」に置換されました。</p>



<p class="is-style-icon_announce">基本か拡張かであれば、拡張の方を使用する事を推奨します。</p>



<h3 class="wp-block-heading">直前の文字の1回以上の繰り返しするには「+」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の1回以上の繰り返しする</span>場合です。拡張正規表現のみ使用できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/roo+t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現
sed -r &#39;s/roo+t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
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</code></pre></div>



<p class="has-border -border01">基本正規表現は対応していないので置換されず、拡張の方は「root」が「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">直前の文字の0回もしくは1回の繰り返しするには「?」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の0回もしくは1回の繰り返しする</span>場合です。拡張正規表現のみ使用できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/ro?t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現１
sed -r &#39;s/ro?t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現２
sed -r &#39;s/roo?t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現３
sed -r &#39;s/rooo?t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
拡張正規表現１
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
拡張正規表現３
shellscript:x:0:0:shellscript:/shellscript:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin</code></pre></div>



<p>拡張１は「rt」と「rot」、拡張２は「rot」と「root」、拡張３は「root」と「rooot」が抽出されます。</p>



<p class="has-border -border01">基本正規表現は対応していないので置換されず、拡張１は「rt」や「rot」がないので置換されず、拡張2と3は「root」が「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">直前の文字のm回の繰り返しするには{m}を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の繰り返し回数を指定する</span>場合です。基本正規表現を使用したい場合は「｛」や「｝」の前に「\」を付けます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/ro\{2\}t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現
sed -r &#39;s/ro{2}t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
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</code></pre></div>



<p class="has-border -border01">どちらも「root」が「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">直前の文字のm回以上の繰り返しするには{m,}を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の繰り返し回数以上を指定する</span>場合です。基本正規表現を使用したい場合は「｛」や「｝」の前に「\」を付けます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/ro\{2,\}t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現
sed -r &#39;s/ro{2,}t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
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</code></pre></div>



<p class="has-border -border01">どちらも「root」が「「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">直前の文字のm回以上n回以下の繰り返しするには{m,n}を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直前の文字の繰り返し回数以上と以下を指定する</span>場合です。基本正規表現を使用したい場合は「｛」や「｝」の前に「\」を付けます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現
sed &#39;s/ro\{2,3\}t/shellscript/g&#39; /etc/passwd | head -n 2
echo 拡張正規表現
sed -r &#39;s/ro{2,3}t/shellscript/g&#39; /etc/passwd | head -n 2</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現
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</code></pre></div>



<p class="has-border -border01">どちらも「root」が「shellscript」に置換されました。</p>



<p class="is-style-icon_announce">最後に補助的なメタ文字をご紹介します。</p>



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



<figure class="wp-block-table"><table><thead><tr><th>基本正規表現メタ文字</th><th>拡張正規表現メタ文字</th><th>効果</th></tr></thead><tbody><tr><td>\</td><td>\</td><td>直後のメタ文字を普通の文字として扱う</td></tr><tr><td>\(\)</td><td>()</td><td>指定する文字列をクループ化する</td></tr><tr><td>無し</td><td>|</td><td>複数の正規表現をORで繋げる</td></tr></tbody></table><figcaption class="wp-element-caption">シェルスクリプトで使用できる補助的正規表現一覧</figcaption></figure>



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



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="grep_test.txt"><code>ro\{2\}t
root
abcc
abcbc
abcbcbc
123
12323
1232323
123123123
12333
abcabcabc</code></pre></div>



<h3 class="wp-block-heading">直後のメタ文字を普通の文字として扱うには「\」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">直後のメタ文字を普通の文字として扱う</span>場合です。基本正規表現と拡張正規表現とどちらも使用できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現１　繰り返し
sed &#39;s/ro\{2\}t/shellscript/g&#39; 6_sed/sed_test2.txt | head -n 2

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

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

echo 拡張正規表現２　直後のメタ文字を普通の文字として扱う
sed -r &#39;s/ro\\\{2\\\}t/shellscript/g&#39; 6_sed/sed_test2.txt | head -n 2</code></pre></div>



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



<p>このままでは「root」が抽出されるので「\」を「\」で普通の文字列にエスケープします。<span class="swl-marker mark_orange">これで「ro\{2\}t」という文字列が置換できます。</span></p>



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



<p>「ro\{2\}t」の「\」と「{」と「}」を「\」で普通の文字列にエスケープします。<span class="swl-marker mark_orange">これで拡張正規表現の方も「ro\{2\}t」という文字列が置換できます。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現１　繰り返し
ro\{2\}t
shellscript
基本正規表現２　直後のメタ文字を普通の文字として扱う
shellscript
root
拡張正規表現１　変化なし
ro\{2\}t
root
拡張正規表現２　直後のメタ文字を普通の文字として扱う
shellscript
root</code></pre></div>



<p class="has-border -border01">基本正規表現は「ro\\{2\\}t」拡張正規表現は「ro\\\{2\\\}t」とすることで「ro\{2\}t」という文字列が「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">指定する文字列をクループ化して扱うには()を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">指定する文字列をクループ化して扱う</span>場合です。基本正規表現と拡張正規表現とどちらも使用できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 基本正規表現１　単体文字繰り返し
sed &#39;s/abc\{2\}/shellscript/g&#39; 6_sed/sed_test2.txt | head -n 5

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

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

echo 拡張正規表現２　グループで繰り返し
sed -r &#39;s/a(bc){2}/shellscript/g&#39; 6_sed/sed_test2.txt | head -n 5</code></pre></div>



<p>基本正規表現１は指定したファイルの中で「abc」の一つ前の「c」を2回繰り返すというシェルスクリプトでした。しかし「bc」の繰り返しにしたい場合は、基本正規表現２のように<span class="swl-marker mark_orange">該当文字列を<span class="swl-inline-color has-swl-deep-01-color">\(\)</span>で囲いグループ化します。</span></p>



<p>拡張正規表現１も同様です。「bc」の繰り返しにしたい場合は、拡張正規表現２のように<span class="swl-marker mark_orange">該当文字列を<span class="swl-inline-color has-swl-deep-01-color">()</span>で囲いグループ化します。</span></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>基本正規表現１　単体文字繰り返し
ro\{2\}t
root
shellscript
abcbc
abcbcbc
基本正規表現２　グループで繰り返し
ro\{2\}t
root
abcc
shellscript
shellscriptbc
拡張正規表現１　単体文字繰り返し
ro\{2\}t
root
shellscript
abcbc
abcbcbc
拡張正規表現２　グループで繰り返し
ro\{2\}t
root
abcc
shellscript
shellscriptbc</code></pre></div>



<p class="has-border -border01">どちらの１も「abcc」が、どちらの２も「abcbc」が「shellscript」に置換されました。</p>



<h3 class="wp-block-heading">複数の正規表現をORで繋げるには「|」を使用します。</h3>



<p><span class="swl-inline-color has-swl-deep-01-color">複数の正規表現をORで繋げる</span>場合です。拡張正規表現しか対応していません。</p>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>echo 拡張正規表現１
sed -r &#39;s/abc|123/shellscript/g&#39; 6_sed/sed_test2.txt</code></pre></div>



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



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>拡張正規表現１
ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
shellscript
shellscript23
shellscript2323
shellscriptshellscriptshellscript
shellscript33
shellscriptshellscriptshellscript</code></pre></div>



<p class="has-border -border01">指定したファイルの中で「abc」か「123」という文字列をが「shellscript」に置換されました。</p>


<div class="wp-block-image is-style-border">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="512" src="https://sugublog.org/wp-content/uploads/2021/11/programing_shool1121-2-1024x512.jpg" alt="training" class="wp-image-4542" srcset="https://sugublog.org/wp-content/uploads/2021/11/programing_shool1121-2-1024x512.jpg 1024w, https://sugublog.org/wp-content/uploads/2021/11/programing_shool1121-2-300x150.jpg 300w, https://sugublog.org/wp-content/uploads/2021/11/programing_shool1121-2-768x384.jpg 768w, https://sugublog.org/wp-content/uploads/2021/11/programing_shool1121-2.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9330904718533231"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-9330904718533231"
     data-ad-slot="8455594968"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p>ではここで質問です。</p>



<p class="is-style-big_icon_hatena">したのシェルスクリプトを実行すると置換結果はどのようになるでしょうか？</p>



<dl class="swell-block-dl">
<dt class="swell-block-dl__dt">sed -r &#8216;s/abc|123{3}/shellscript/g&#8217; 6_sed/sed_test2.txt</dt>



<dd class="swell-block-dl__dd">
<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
123
12323
1232323
123123123
shellscript
shellscriptshellscriptshellscript</code></pre></div>
</dd>



<dt class="swell-block-dl__dt">sed -r &#8216;s/abc|(123){3}/shellscript/g&#8217; 6_sed/sed_test2.txt</dt>



<dd class="swell-block-dl__dd">
<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ro\{2\}t
root
shellscriptc
shellscriptbc
shellscriptbcbc
123
12323
1232323
shellscript
12333
shellscriptshellscriptshellscript</code></pre></div>
</dd>



<dt class="swell-block-dl__dt">sed -r &#8216;s/(abc|123){3}/shellscript/g&#8217;  6_sed/sed_test2.txt</dt>



<dd class="swell-block-dl__dd">
<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ro\{2\}t
root
abcc
abcbc
abcbcbc
123
12323
1232323
shellscript
12333
shellscript</code></pre></div>
</dd>
</dl>


<div class="swell-block-balloon"><div class="c-balloon -bln-right" data-col="blue"><div class="c-balloon__icon -square"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://sugublog.org/wp-content/uploads/2021/02/mine_white_002-e1624111291945.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://sugublog.org/wp-content/uploads/2021/02/mine_white_002-e1624111291945.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">管理人</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>シェルスクリプトのsedでの置換は非常によく使用するので、このページを何度も読んで是非マスターしてください。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://sugublog.org/shellscript-sed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
