(18)【sed】シェルスクリプトコマンド活用紹介

sedコマンド概要

 「sed」は「Stream EDitor」の略で、「sed スクリプトコマンド ファイル名」で、指定したファイルをコマンドに従って処理し、標準出力へ出力します。ファイル名を省略した場合は、標準入力からのデータを処理します。sedコマンドでは、パイプとリダイレクトを活用するのが一般的です。

sedコマンドの書式

sed [オプション]
sed [オプション] スクリプトコマンド 入力ファイル

sedコマンドの主なオプション

オプション 意味
-e スクリプト スクリプト(コマンド)を追加する
-f スクリプトファイル 実行するコマンドとしてスクリプトファイルの内容を追加する

|-t 文字数 |タブの文字数またはタブ位置のリストを指定する|

sedのバージョンを確認する

$ sed --version

僕の環境では以下のとおりです

bash-5.1$ sed --version
gsed (GNU sed) 4.8
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
Paolo Bonzini, Jim Meyering, and Assaf Gordon.

This sed program was built without SELinux support.

GNU sed home page: <https://www.gnu.org/software/sed/>.
General help using GNU software: <https://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
bash-5.1$

sedコマンド詳細説明

‘sed’を使用した基本的なテキスト置換

sedコマンドを使用してパターンを検索および置換することにより、テキストの特定の部分を検索および置換できます。次の例では、「s」は検索および置換タスクを示します。「BashScriptingLanguage」というテキストで「Bash」という単語が検索され、その単語がテキストに存在する場合は、「Perl」という単語に置き換えられます。

bash-5.1$ echo "Bash Scripting Language" | sed 's/Bash/Perl/'
Perl Scripting Language
bash-5.1$
ヒント
'’ シングルクォーテーションで囲む場合と"“ダブルクォーテーションで囲む場合、動作が異なります。置換前と、置換後の文字列指定を「文字列」で扱う場合はシングルクォーテーションで構いませんが、s/Bash/$value/ などの変数で置き換えたい場合はダブルクォーテーションで囲みます。
ヒント
s/Bash/Perl/ と指定する場合の s ですが、substitute(置き換える)です。

まず、weekday.txtを作成します。

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

以下のコマンドで Sunday を Sunday is holiday に置き換えます

$ cat weekday.txt | sed 's/Sunday/Sunday is holiday/'

実行結果は以下のとおりです。

bash-5.1$ cat weekday.txt | sed 's/Sunday/Sunday is holiday/'
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday is holiday
bash-5.1$

‘g’オプションを使用して、ファイルの特定の行にあるテキストのすべてを置き換える

‘g’オプションは、ファイル内の一致するパターンすべてを置き換えます。

まずpython.txtを作成します

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

以下のコマンドで Python を perl に置き換えます。

$ cat python.txt | sed 's/Python/perl/g' python.txt

実行結果は以下のとおりです。

bash-5.1$ cat python.txt | sed 's/Python/perl/g'
perl is a very popular language.
perl is easy to use. perl is easy to learn.
perl is a cross-platform language
ヒント
s/Python/perl/g と指定する場合の g ですが、global(全体的に)です。

次に2行目の Python を perlに置き換えます。
置き換えたい行数を 2 と指定しています。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language
$ cat python.txt | sed '2 s/Python/perl/g' python.txt

実行結果は以下のとおりです。

bash-5.1$ cat python.txt | sed '2 s/Python/perl/g'
Python is a very popular language.
perl is easy to use. perl is easy to learn.
Python is a cross-platform language

各行で一致する2番目の値のみを置き換える

ファイル中に存在するPythonを、各行の2番目に出現する検索パターンだけをperlに置き換えます。

g2オプションを使います。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

実行結果は以下のとおりです。

bash-5.1$ cat python.txt | sed 's/Python/perl/g2'
Python is a very popular language.
Python is easy to use. perl is easy to learn.
Python is a cross-platform language
bash-5.1$

各行で一致する最後の値のみを置き換える

ファイル中に存在するPythonを、各行の最後に出現する検索パターンだけをperlに置き換えます。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

実行結果は以下のとおりです。

bash-5.1$ cat python.txt | sed 's/\(.*\)Programming/\1Scripting/' 
Python is a very popular language.
Python is easy to use. perl is easy to learn.
Python is a cross-platform language
bash-5.1$
ヒント
\(.*\) の部分は正規表現といいます。正規表現は記号を含めて無限に指定することができる激しく便利な機能です。ポピュラーな使い方から覚えて、次第と複雑でトリッキーな使い方を習得していけば良いと思います。Google で sed 正規表現 と検索すればたくさん検索結果が出てきます。

ファイル内の最初の一致を新しいテキストに置き換える

次のコマンドは、検索パターンの最初の一致である「Python」のみをテキスト「perl」に置き換えます。ここで、「1」はパターンの最初の出現に一致するために使用されます。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

実行結果は以下のとおりです。

$ cat python.txt | sed '1 s/Python/perl/'
perl is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

ファイル内の最後の一致を新しいテキストに置き換える

次のコマンドは、最後に出現した検索パターン「Python」をテキスト「Bash」に置き換えます。ここで、「$」記号は、パターンの最後の出現と一致するために使用されます。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language

実行結果は以下のとおりです。

$ cat python.txt | sed '$s/Python/perl/'
Python is a very popular language.
Python is easy to use. Python is easy to learn.
perl is a cross-platform language
ヒント
「ファイル内」の最後のマッチです。

ファイルパスの検索と置換を管理するためのreplaceコマンドでのバックスラッシュのエスケープ

検索および置換するには、ファイルパスのバックスラッシュをエスケープする必要があります。次のsedコマンドは、ファイルパスにバックスラッシュ記号(\)を追加します。

ヒント
\記号はウインドウズだと¥で表示されます。
Macでは¥キーを押すことで\バックスラッシュを入力することできます。
Macで¥キーを押してもバックスラッシュが入力できない場合は、はOptionキーを押しながら¥を押すことでバックスラッシュを入力することができます。一般的に¥と\は区別されています。

実行結果は以下のとおりです。

$ echo /home/ubuntu/code/perl/add.pl | sed 's;/;\\/;g'
\/home\/ubuntu\/code\/perl\/add.pl
$
$ echo /home/ubuntu/code/perl/add.pl | sed 's|/|\\/|g'
\/home\/ubuntu\/code\/perl\/add.pl
ヒント
上記では「s;」とすることで、セミコロンを区切り文字として指定しています。理由は見た目がわかりやすいからです。
何でもいいのです。「s|」とすれば、区切り文字はパイプに指定することができます。

ファイルのフルパスをファイル名だけに置き換える

ファイル名は、basenameコマンドを使用してファイルパスから非常に簡単に取得できますが、sedコマンドを使用して、ファイルパスからファイル名を取得することもできます。次のコマンドは、echoコマンドで指定されたファイルパスからのみファイル名を取得します。

$ basename "/home/ubuntu/temp/myfile.txt"
myfile.txt

$ echo "/home/ubuntu/temp/myfile.txt" | sed 's/.*\///'
myfile.txt
$
ヒント
basename コマンドを使うのが一般的ですが、sedに置き換えることでsedの正規表現の理解を深めることが狙いです。

マッチした文字列のあとに出現した文字列が見つかった場合に置換する

次のsedコマンドでは、2つの置換コマンドが使用されています。文字列「CSE 」でマッチした行で「Count 」は100に置き換えられ、文字列「EEE」でマッチした行で「Count」は70に置き換えられます。

CSE - Count
EEE - Count
Civil - Count

実行結果は以下のとおりです。

$ cat dept.txt | sed  -e '/CSE/ s/Count/100/; /EEE/ s/Count/70/;'
CSE - 100
EEE - 70
Civil - Count
ヒント
以外に知られていないトリッキーなsedの利用例ですが、とてもよく使われます。

文字列に他のテキストが見つからない場合のみテキストを置き換える

次のsedコマンドは、テキスト「CSE」を含まない行の「Count」値を置き換えます。dept.txtファイルには、テキスト「CSE」を含まない2行が含まれています。したがって、「カウント」テキストは2行で80に置き換えられます。

CSE - Count
EEE - Count
Civil - Count

実行結果は以下のとおりです。

$ cat dept.txt | sed '/CSE/! s/Count/80/;'
CSE - Count
EEE - 80
Civil - 80
ヒント
!(アポストロフィー)をつけると「以外は」という意味になります。

' \ 1 ‘を使用して、一致するパターンの前に文字列を追加

sedコマンドで一致するパターンマッチは、「\1」、「\2」などで示されます。

次のsedコマンドは、パターン’Bash’を検索し、パターンが一致する場合は、テキストを置き換える部分「bash」を’\1’として処理をします。
ここでは、入力テキストで「Bash」というテキストが検索され、「\1」の前に1つのテキストが追加され、後に別のテキストが追加されます。

$ echo "Bash language" | sed  's/\(Bash\)/Learn \1 programming/'
Learn Bash programming language
ヒント
難しく考える必要はありません。’s/(文字列)/ で文字列を検索します。その後、検索した文字列を \1 として、文字A \1 文字B として出力します。

一致する行を削除

’d’オプションは、ファイルから任意の行を削除するためにsedコマンドで使用されます。os.txtという名前のファイルを作成し、次のコンテンツを追加して、 「d」オプションの機能をテストします。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt | sed '/OS/ d'
Windows
Linux
Android
bash-5.1$
ヒント
d オプションは、delete(削除)です。

一致する行の後の2行を削除

次のコマンドは、パターン「Linux」が見つかった場合、ファイルos.txtから3行を削除します。os.txtには、2行目に「Linux 」というテキストが含まれています。したがって、この行と次の2行は削除されます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt | sed '/Linux/,+2d'
Windows

テキスト行の最後にあるすべてのスペースを削除

[:blank:]クラス(といいます)を使用すると、テキストまたは任意のファイルのコンテンツからスペースとタブを削除できます。次のコマンドは、ファイルos.txt の各行の終わりにあるスペースを削除します。

以下のテキストの行末には半角スペースが3つづつついています。(みえないけど)

Windows   
Linux   
Android   
OS   

実行結果は以下のとおりです。

$ cat os_space.txt
Windows
Linux
Android
OS
$
$ cat os_space.txt | sed '/^[[:blank:]]*$/d'
Windows
Linux
Android
OS

出力されたテキストには、半角スペースが除去されています(みえないけど)

行で2回一致するすべての行を削除

次の内容のinput.txtという名前のテキストファイルを作成し、検索パターンを含むファイルの行を2回削除します。

PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.

input.txtファイルには一行に「PHP」というワードが2回表示される行が2行あります。
以下の例では、sedコマンドの -e オプションを使って、sedコマンドを連続して使用し、パターン’PHP’を含む2行を削除します。

最初のsedコマンドは、各行の2番目に出現する’PHP’を’dl’に置き換え、次のsedコマンド「-e」で、テキスト’ dl ‘を含む行を「dオプション」で削除します。

実行結果は以下のとおりです。

cat input.txt
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.
$
$ cat input.txt | sed -e 's/php/dl/i2;' -e '/dl/d'
PHP is a server-side scripting language.
PHP is platform-independent.

空行を削除

この例をテストするには、コンテンツに空の行が含まれているファイルを選択します。前の例で作成されたinput.txtファイルには、次のsedコマンドを使用して削除できる2つの空の行が含まれています。ここで、「^$」は、ファイルinput.txtの空の行を見つけるために使用されます。

Windows

Linux

Android

OS

実行結果は以下のとおりです。

$ cat os_blank.txt
Windows

Linux

Android

OS

$ cat os_blank.txt | sed '/^$/d'
Windows
Linux
Android
OS
ヒント
^$ は 行頭(^)と行末($)の間になにもない(空行)という意味になります。ものすごく良く使います。

印刷できない文字をすべて削除

印刷できない文字をnoneに置き換えることにより、印刷できない文字を任意のテキストから削除できます。
この例では、[:print:]クラスを使用して、印刷できない文字を検索します。'\ t’は印刷できない文字なので、echoコマンドで直接解析することはできません。
以下のコマンドを実行すると、「echo」コマンドで使用される変数$tabに「\t」文字が混入しても、sedコマンドで[:print:]に該当する文字’\t’が削除されます。

実行結果は以下のとおりです。

$ tab=$'\t'
$ echo Hello"$tab"World
Hello	World
$ echo Hello"$tab"World | sed 's/[^[:print:]]//g'
HelloWorld
$
ヒント
上記のコマンドを実行すると、次の出力が表示されます。最初のechoコマンドはTAB付きで出力し、sedコマンドの[^[:print:]]出力できない文字であるタブスペースを削除し出力します。

一致した場合行末に文字列を追加

次のsedコマンドは、 os.txtファイルのテキスト「Windows」を含む行の最後に「10」を追加します。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed '/Windows/ s/$/ 10/'
Windows 10
Linux
Android
OS

一致した場合行前に行を挿入

次のsedコマンドは、前に作成されたinput.txtファイルの「PHP is platform-independent」というテキストを検索します。ファイルのいずれかの行にこのテキストが含まれている場合、「PHP is an interpreted language」がその行の前に挿入されます。

PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.

実行結果は以下のとおりです。

cat input.txt
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.
$
cat input.txt | sed '/PHP is platform-independent/ s/^/PHP is an interpreted language.\n/'
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is an interpreted language.
PHP is platform-independent.

一致したら一致行の下に文字列を挿入

次のsedコマンドは、ファイルos.txt内のテキスト’ Linux’を検索し、テキストがいずれかの行に存在する場合は、新しいテキスト' Ubuntu ‘がその行の後に挿入されます。

Windows
Linux
Android
OS

実行結果は以下のとおりです

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt | sed 's/Linux/&\nUbuntu/'
Windows
Linux
Ubuntu
Android
OS
$
ヒント
&\n が自分自身の行のあとに改行という意味になります。

一致しない場合は行末に文字列を追加

次のsedコマンドは、os.txt内でテキスト「Linux」を含まない行を検索し、各行の最後にテキスト「Operating System」を追加します。ここで、「$」記号は、新しいテキストが追加される行を識別するために使用されます。

Windows
Linux
Android
OS
$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed '/Linux/! s/$/ Operating System/'
Windows Operating System
Linux
Android Operating System
OS Operating System
ヒント
/Linux/! で、Linuxという文字列が行になければという意味、$は行末を意味します。Operation Systemの戦闘に空白が有るのがミソです。

一致しない行を削除

web.txtという名前のファイルを作成し、次のコンテンツを追加して、一致するパターンを含まない行を削除します。

HTML5
JavaScript
CSS
PHP
MySQL
JQuery

次のsedコマンドは、テキスト「CSS」を含まない行を検索して削除します。

実行結果は以下のとおりです。

$ cat web.txt
HTML5
JavaScript
CSS
PHP
MySQL
JQuery
$
$ cat web.txt | sed '/CSS/!d'
CSS

上記のコマンドを実行すると、次の出力が表示されます。‘CSS’というテキストを含むファイルに1行あります。したがってCSSを含む1行だけが出力され、CSSを含まない行は削除されます。

テキストの後にスペースを追加した後、一致したテキストを複製する

次のsedコマンドは、ファイルpython.txt内の’to’という単語を検索します。その単語が存在する場合は、スペースを追加して、同じ単語が検索単語の後に挿入されます。ここでは、「&」記号を使用して重複テキストを追加しています。

Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language
$ cat python.txt
Python is a very popular language.
Python is easy to use. Python is easy to learn.
Python is a cross-platform language
$
$ cat python.txt | sed -e 's/to /& to/g'
Python is a very popular language.
Python is easy to  touse. Python is easy to  tolearn.
Python is a cross-platform language
$
ヒント
意味のないサンプルとなりましたが、このコマンドを実行すると、「to」という単語がファイルpython.txtで検索され、この単語はこのファイルの2行目に存在することがわかります。結果、一致するテキストの後にスペースを含む「to 」が追加されます。

文字列のリストの1つを新しい文字列に置き換える

この例をテストするには、2つのリストファイルを作成する必要があります。

1001 => Jafar Ali
1023 => Nir Hossain
1067 => John Michel
1001    CSE     GPA-3.63
1002    CSE     GPA-3.24
1023    CSE     GPA-3.11
1067    CSE     GPA-3.84

次のsedコマンドは、上記の2つのテキストファイルの最初の列と一致し、一致するテキストをファイルlist1.txtの3番目の列の値に置き換えます。

実行結果は以下のとおりです。

$ cat list1.txt
1001 => Jafar Ali
1023 => Nir Hossain
1067 => John Michel
$
$ cat list2.txt
1001    CSE     GPA-3.63
1002    CSE     GPA-3.24
1023    CSE     GPA-3.11
1067    CSE     GPA-3.84
$
$ sed `cat list1.txt | awk '{print "-e s/"$1"/"$3"/"}'`<<<"` cat list2.txt`"
Jafar   CSE     GPA-3.63
1002    CSE     GPA-3.24
Nir     CSE     GPA-3.11
John    CSE     GPA-3.84
ヒント
list1.txtファイルの1001、1023、1067は、list2.txtファイルの3つのデータと一致し、これらの値は、list1.txtの3番目の列の対応する名前に置き換えられます。

一致した文字列を改行を含む文字列に置き換える

次のコマンドは、 echoコマンドから入力を受け取り、テキスト内の「Python」という単語を検索します。単語がテキストに存在する場合、新しいテキスト「Added Text」が改行で挿入されます。

$ echo "Bash Perl Python Java PHP ASP" | sed 's/Python/Added Text\n/'
Bash Perl Added Text
 Java PHP ASP

ファイルから改行を削除し各行の最後にコンマを挿入

次のsedコマンドは、ファイルos.txtの各改行をコンマに置き換えます。ここで、-zオプションは、行をNULL文字で区切るために使用されます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed -z 's/\n/,/g'
Windows,Linux,Android,OS,$

カンマを削除し、改行を追加して、テキストを複数の行に分割

次のsedコマンドは、echoコマンドからコンマで区切られた行を入力として受け取り、コンマを改行に置き換えます。

$ echo "Kaniz Fatema,30th,batch" | sed "s/,/\n/g"
Kaniz Fatema
30th
batch
ヒント
上記のコマンドを実行すると、入力テキストのカンマは改行に置き換えられ3行で印刷されます。

大文字と小文字を区別しない一致を検索し、行を削除

次のsedコマンド’I’は、大文字と小文字を区別しないオプションです。一致で大文字と小文字を無視することを示します。

次のsedコマンドは、「linux」という単語を大文字小文字を区別せずに検索し、 os.txtファイルからその行を削除します。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed '/linux/Id'
Windows
Android
OS

大文字と小文字を区別しない一致を見つけて、新しいテキストに置き換える

次のsedコマンドは、echoコマンドからの入力を受け取り、単語’bash’を単語’PHP’に置き換えます。

「Bash」という単語は、大文字と小文字を区別しない検索のために「bash」という単語と一致し、「PHP」という単語に置き換えられています。

$ echo "I like bash programming " | sed 's/Bash/PHP/i'
I like PHP programming

大文字と小文字を区別しない一致を見つけて、同じテキストのすべて大文字に置き換える

‘\U’は、テキストをすべて大文字に変換します。次のsedコマンドは、 os.txtファイル内の単語’linux’を大文字小文字を区別せずに検索し、単語が存在する場合は、単語をすべて大文字に置き換えます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed 's/\(linux\)/\U\1/Ig'
Windows
LINUX
Android
OS

大文字と小文字を区別しない一致を見つけて、同じテキストのすべての小文字に置き換える

‘\L’はsedで使用され、テキストをすべて小文字に変換します。次のsedコマンドは、os.txtファイルの「Linux」という単語を検索し、その単語をすべて小文字に置き換えます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$ cat os.txt | sed 's/\(linux\)/\L\1/Ig'
Windows
linux
Android
OS

テキスト内のすべての大文字を小文字に置き換える

次のsedコマンドは、os.txtファイル内のすべての大文字を検索し、「\L」を使用して文字を小文字に置き換えます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt | sed  's/\(.*\)/\L\1/'
windows
linux
android
os

行の番号を検索し、番号の後に通貨記号を追加

以下のファイルを準備します。

HDD       100
Monitor   80
Mouse     10

実行結果は以下の通りです。

$ cat items.txt
HDD       100
Monitor   80
Mouse     10
$
$ cat items.txt | sed 's/\([0-9]\)/$\1/'
HDD       $100
Monitor   $80
Mouse     $10

上記のコマンドを実行すると、次の出力が表示されます。ここでは、各行の番号の前に「$」記号が追加されています。

3桁を超える数値にコンマを追加

次のsedコマンドは、 echoコマンドからの入力として数値を受け取り、右から数えて3桁の各グループの後にコンマを追加します。ここで、「:a」はラベルを示し、「ta」はグループ化プロセスを繰り返すために使用されます。

$ echo "5098673" | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
5,098,673
ヒント
ようするに桁区切りをsedコマンドで実現するということです。

タブ文字を4つのスペース文字に置き換えます

次のsedコマンドは、各タブ(\ t)文字を4つのスペース文字に置き換えます。「$」記号は「sed」コマンドでタブ文字と一致するように使用され、「g」はすべてのタブ文字を置き換えるために使用されます。

実行結果は以下のとおりです。\tという文字列が

$ echo -e "1\t2\t3" | sed $'s/\t/    /g'
1    2    3

4つの連続するスペース文字をタブ文字に置き換えます

次のコマンドは、4つの連続する文字をタブ(\ t)文字に置き換えます。

$ echo -e "1    2" | sed $'s/    /\t/g'
1	2

すべての行を最初の80文字に切り捨てます

この例をテストするには、80文字を超える行を含むin.txtという名前のテキストファイルを作成します。

PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.
$ cat in.txt
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.PHP is platform-independent.
$
$ cat in.txt | sed 's/\(^.\{1,80\}\).*/\1/'
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.PHP is platform-indepen
ヒント
上記のコマンドを実行すると、次の出力が表示されます。in.txtファイルの2行目には、80文字を超える文字が含まれており、この行は出力で切り捨てられます。

文字列の正規表現を検索し、その後に標準テキストを追加

次のsedコマンドは、入力テキスト内のテキスト’ hello ‘を検索し、そのテキストの後にテキスト’ John ‘を追加します。

実行結果は以下のとおりです。

$ echo "hello, how are you?" | sed 's/\(hello\)/\1 John/'
hello John, how are you?

文字列の正規表現と、その後に見つかった文字列の2番目のコピーを検索します

次のsedコマンドは、 input.txtの各行のテキスト「 PHP 」を検索し、各行の2番目の一致をテキスト「NewTextAdded」に置き換えます。

PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.

実行結果は以下のとおりです。

$ cat input.txt | sed 's/\(PHP\)/\1 (New Text added)/2'
PHP is a server-side scripting language.
PHP is an open-source language and PHP (New Text added) is case-sensitive.
PHP is platform-independent.
ヒント
上記のコマンドを実行すると、次の出力が表示されます。検索テキスト「PHP 」は、 input.txtファイルの2行目と3行目に2回表示されます。そのため、2行目と3行目に「NewTextadded」というテキストが挿入されます。

ファイルからの複数行のsedスクリプトの実行

複数のsedスクリプトをファイルに保存し、sedコマンドを実行することですべてのスクリプトを一緒に実行できます。‘sedcmd ‘という名前のファイルを作成し、次のコンテンツを追加します。ここでは、2つのsedスクリプトがファイルに追加されています。1つのスクリプトがテキスト「PHP」を「ASP」に置き換えます。別のスクリプトがテキスト「独立」をテキスト「依存」に置き換えます。

s/PHP/ASP/
s/independent/dependent/
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.

実行結果は以下のとおりです。

$ cat sedcmd
s/PHP/ASP/
s/independent/dependent/
$
$ cat input.txt
PHP is a server-side scripting language.
PHP is an open-source language and PHP is case-sensitive.
PHP is platform-independent.
$
$ cat input.txt | sed -f sedcmd
ASP is a server-side scripting language.
ASP is an open-source language and PHP is case-sensitive.
ASP is platform-dependent.
ヒント
同様の検索ルールを別ファイルにしておくことで、何度も同じルールを書くことをしなくてすみます。必要なときにファイルを読み出せばよいわけです。

複数行のパターンに一致し、新しい複数行のテキストに置き換える

次のsedコマンドは、複数行のテキスト’Linux \ nAndroid’を検索し、パターンが一致する場合、一致する行は複数行のテキスト’ Ubuntu \nAndroidLollipop’に置き換えられます。ここで、PとDはマルチライン処理に使用されます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt | sed '$!N;s/Linux\nAndroid/Ubuntu\nAndoid Lollipop/;P;D'
Windows
Ubuntu
Andoid Lollipop
OS
ヒント
わけがわかりませんね。http://blog.livedoor.jp/morituri/archives/52036613.html こちらを参考に。検索文字列は「sed Nコマンド」です。

パターンに一致する2つの単語の順序を置き換えます

次のsedコマンドは、 echoコマンドから2つの単語の入力を受け取り、これらの単語の順序を置き換えます。

実行結果は以下のとおりです。

$ echo "perl python" | sed -e 's/\([^ ]*\) *\([^ ]*\)/\2 \1/'
python perl

コマンドラインから複数のsedコマンドを使用する

‘-e’オプションは、コマンドラインから複数のsedスクリプトを実行するためにsedコマンドで使用されます。次のsedコマンドは、 echoコマンドからの入力としてテキストを受け取り、「Ubuntu」を「Kubuntu」に、「Centos」を「Fedora」に置き換えます。

実行結果は以下のとおりです。

$ echo "Ubuntu Centos Debian" | sed -e 's/Ubuntu/Kubuntu/; s/Centos/Fedora/'
Kubuntu Fedora Debian

sedを他のコマンドと組み合わせる

次のコマンドは、sedコマンドとcatコマンドを組み合わせたものです。最初のsedコマンドはos.txtファイルから入力を受け取り、テキスト'‘Linux’を’Fedora’に置き換えた後、コマンドの出力を2番目のsedコマンドに送信します。2番目のsedコマンドは、テキスト「Windows」を「Windows10」に置き換えます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt | sed 's/Linux/Fedora/'| sed 's/windows/Windows 10/i'
Windows 10
Fedora
Android
OS
ヒント
sedの連結は以下のように書くことができます。
$ cat os.txt | sed -e 's/Linux/Fedora/' -e  's/windows/Windows 10/i'
Windows 10
Fedora
Android
OS
bash-5.1$
ヒント
sed -e と書くことで、パイプで渡すことなく、sedコマンドを連続して使うことができます。

ファイルに空の行を挿入

次の内容のstdlist.txtを作成します。

#ID #Name
[ 101 ]    -Ali
[ 102 ]    -Neha

「G」オプションは、ファイルに空の行を挿入するために使用されます。次のsedコマンドは、 stdlistファイルの各行の後に空の行を挿入します。

実行結果は以下のとおりです。

$ cat stdlist.txt
#ID #Name
[ 101 ]    -Ali
[ 102 ]    -Neha
$
$ sed G stdlist.txt
#ID #Name

[ 101 ]    -Ali

[ 102 ]    -Neha

ヒント
一見、使われそうなGオプションですが、使うシチュエーションに出会ったことがありません。

ファイルの各行からすべての英数字を削除

次のコマンドは、 stdlistファイル内のすべての英数字をスペースに置き換えます。

#ID #Name
[ 101 ]    -Ali
[ 102 ]    -Neha

実行結果は以下のとおりです。

$ cat stdlist.txt
#ID #Name
[ 101 ]    -Ali
[ 102 ]    -Neha
$
$ cat stdlist.txt | sed 's/[A-Za-z0-9]//g'
# #
[  ]    -
[  ]    -
$

「&」を使用して文字列と一致させる

次のコマンドは、「L」で始まる単語を検索し、「Matched String is –」を「&」記号を使用して一致した単語に追加することでテキストを置き換えます。ここで、「p」は変更されたテキストを印刷するために使用されます。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt | sed -n 's/^L/Matched String is - &/p'
Matched String is - Linux

単語のペアを切り替える

各行に単語のペアを含む次のコンテンツを含むcourse.txtという名前のテキストファイルを作成します。

PHP            ASP
MySQL          Oracle
CodeIgniter    Laravel

実行結果は以下のとおりです。

$ cat course.txt
PHP ASP
MySQL Oracle
CodeIgniter Laravel
$
$ cat course.txt | sed 's/\([^ ]*\) *\([^ ]*\)/\2 \1/'
ASP PHP
Oracle MySQL
Laravel CodeIgniter
$

各単語の最初の文字を大文字に変換する

次のsedコマンドは、 echoコマンドから入力テキストを受け取り、各単語の最初の文字を大文字に変換します。

$ echo "I like bash programming" | sed 's/\([a-z]\)\([a-zA-Z0-9]*\)/\u\1\2/g'
I Like Bash Programming
ヒント
ここまでくると、カルト級ですね。使いこなせる人がいればほぼ神業ですね。

ファイルの行番号を印刷する

‘=‘記号は、ファイルの各行の前に行番号を出力するためにsedコマンドで使用されます。次のコマンドは、os.txtファイルの内容を行番号とともに出力します。

Windows
Linux
Android
OS

実行結果は以下のとおりです。

$ cat os.txt
Windows
Linux
Android
OS
$
$ cat os.txt |sed '='
1
Windows
2
Linux
3
Android
4
OS
ヒント
できれば行頭に行番号が来てほしいですね。工夫して頑張って作ってみてください。
$ cat os.txt | sed '=' | sed 'N;s/\n/ /'
ヒント
楽しめましたか?では

書籍の紹介

(19)【tar】シェルスクリプトコマンド活用紹介

(19)【tar】シェルスクリプトコマンド活用紹介

(17)【expand】シェルスクリプトコマンド活用紹介

(17)【expand】シェルスクリプトコマンド活用紹介