10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Linux - sedコマンドの基本的な使い方

Last updated at Posted at 2021-04-20

##sedコマンドとは?
・ファイルの中身を指定した条件で表示することができる。
・非対話型のエディタである。
・編集結果を、標準出力に出力するので、元のファイルを変更しない。
・文字列を置換するために用いられることが多い。

上記が主な特徴だと思います!

今回の記事では、よく使われると思われる
行を削除して表示する d 
行を表示する p
行を置換する s
について、説明していきます!

前提条件

シェルには、bushを使用しています。
bushのバージョンは、3.2.57です。
ちなみに、bashのバージョンは、以下のコマンドで確認することができます。

$ bash --version

##今回使うファイル
以下のような内容のファイルにsedコマンドを使用していきます。

test.txt
shinji
shinjishinji
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka

##基本的なコマンド形式
sedコマンドは、以下の形式で実行をします。

$ sed [オプション] <スクリプト> <対象ファイル>

スクリプトとは、コマンドとアドレスを組み合わせたような文字列のことです。
言葉だけだとよくわからないので、実際に書いていくとなんとなくわかってくると思います!

##「d」コマンドの使い方(行を削除して表示する)

$ sed 3d test.txt
shinji
shinjishinji
ayanamiiiiiiii!!!
asuka
shikinami asuka

上記の例だと、「3d」というスクリプトで、3行目の「ayanami」という行を削除して表示しています。
また、「1,3d」のように、数字を「,」でつなげると、1行目から3行目までを削除することができます。

$ sed 1,3d test.txt
ayanamiiiiiiii!!!
asuka
shikinami asuka

他にも、正規表現を用いて行を指定することもできます。
正規表現を使う際には、以下のように/^a/dのように、正規表現の部分を//で囲む必要があります。
下記の例では、aから始まる行を全て削除して表示しています。

$ sed /^a/d test.txt   #aから始まる行を削除して表示
shinji
shinjishinji
shikinami asuka

##「p」コマンドの使い方(指定した行を表示する)
「d」コマンドと同様に、表示させたい行をスクリプトで指定して実行することができます。
しかし、何もオプションを付けずに実行すると以下のようになってしまいます。

$ sed 1p test.txt
shinji    #1行目にあったshinjiが、二つに増えている。
shinji
shinjishinji
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka

これは、sedコマンドの特徴であり、何もオプションを付けずに「p」コマンドを実行すると
「元のファイルの内容」+「pコマンドで指定した行」を表示させるので、結果的に指定した行がひとつ増える表示をさせてしまいます。なぜそうなるかはパターンスペースが関係しているのですが、今回は置いといて、、、
この現象を防ぐには、以下のように「-n」オプションを付けます。
「-n」オプションをつけることによって、パターンスペースの出力をさせなくするオプションです。

$ sed -n 1p test.txt 
shinji

##「d」コマンドの使い方(行を置換して表示する)

sedコマンドの基本的な書式は、以下になります。

sed [オプション] 's/置換前文字列/置換後文字列/フラグ' <ファイル名>

例えば、 「shinji」を「mari」という文字列に置換するコマンドを実行してみると、以下のようになります。

$ sed 's/shinji/mari/' test.txt 
mari     #置換されている
marishinji  #「shinjishinji」が「marishinji」になっている。
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka

フラグを何も付けずにsコマンドを実行すると、指定した文字列が行に複数あった場合、ひとつ目に見つかった文字列しか置換しないという特徴があります。
フラグに「g」をつけることで、全ての文字列を置換することができるようになります。

$ sed 's/shinji/mari/g' test.txt 
mari
marimari
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka

この他にも「s」コマンドのフラグには、
置換が発生した行だけを表示させる「p」フラグ
があります。

##最後に
今回は、sedコマンドの基本的な使い方を紹介しました。
他にも正規表現を使ったり、後方参照を使った置換方法もありますので、興味があったら調べてみると面白いと思います!

##参考文献
以下の本で勉強させてもらってます。とてもわかりやすくて、プログラミング勉強してるけどちょくちょく出てくるLinuxってなんやねん!!って人におすすめです!!

[新しいLinuxの教科書-著者:三宅英明さん、大角祐介さん]
(https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?