Linux sed命令の詳細

6268 ワード

転載元:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html#3495425
1.概要
sedはオンラインエディタで、行の内容を一度に処理します.処理時には、現在処理されている行を一時バッファに格納し、「モード空間」と呼び、モード空間の内容をsedコマンドで処理し、処理が完了したら、バッファの内容を画面に送ります.次の行を処理して、ファイルの最後まで繰り返します.ファイルの内容は変わっていません.これらは全部モード空間で処理されています.Sedは、1つ以上のファイルを自動的に編集するために使用できます.
2.sed使用パラメータ
[root@www ~]# sed [-nefr] [  ]
     :
-n :    (silent)  。    sed     ,     STDIN               。      -n    ,     sed         (    )      。
-e :      ,  -e            ;
-f :    sed           , -f filename       filename    sed   ;
-r :sed                   。(            )
-i :           ,        。

    : [n1[,n2]]function
n1, n2 :      ,    『         』,    ,           10   20       , 『 10,20[    ] 』

function:
a :  , a         ,             (      )~
c :  , c         ,         n1,n2     !
d :  ,      ,   d           ;
i :  , i         ,             (      );
p :  ,            。   p      sed -n     ~
s :  ,            !     s             !   1,20s/old/new/g    !
3.指定された行を処理する
3.1新規行
etc/passwdの2行目に『drink tea?』を付けます!
nl /etc/passwd | sed '2a drink tea'
2行目の前に『drink tea?』を付けます!
 nl /etc/passwd | sed '2i drink tea' 
2行以上追加する場合は、2行目の後ろに2行のワードを追加します.例えば『Drink tea or…』と『drink beer?』です.各行の間に、バックスラッシュ(\)で新しい行を追加しなければなりません.
nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
3.2行の削除
etc/passwdの内容を並べて行番号を印刷します.また、2~5行目を削除してください.
nl /etc/passwd | sed '2,5d'
2行目を削除するだけで
nl /etc/passwd | sed '2d' 
3番目の行から最後の行まで削除します.
nl /etc/passwd | sed '3,$d' 
3.3行を表示する
リスト/etc/passwdファイル内の5-7行目のみ
nl /etc/passwd | sed -n '5,7p'
3.4换行
2行目の内容を『No 2-5 number』に置き換えますか?
nl /etc/passwd | sed '2,5c No 2-5 number'
4.マッチングした行を処理する
4.1マッチする行を探して表示する
検索/etc/passwdはrootキーワードの行があります.
nl /etc/passwd | sed -n '/root/p'
1
4.2マッチする行を探して削除する
nl /etc/passwd | sed -n '/root/d'
1
4.3マッチする行を探して、サブストリングを置換する
文法はこのように似ています
sed 's/       /    /g'
新しい文字列が空の場合、代わりの部分列が削除されるのと同じ機能です.
マシンのipアドレスを取得するには、以下のコマンドが使用できます.
 /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
1
二つのsedコマンドは、ipアドレスの前と後ろのサブストリングを削除します.
4.4マッチした行を探してコマンドを実行する
検索/etc/passwd、rootに対応する行を見つけて、後ろの括弧の中の命令群を実行して、各コマンドの間にセミコロンで区切ります.ここでbashをblueshellに変えて、この行を出力します.
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
1
もし/etc/passwdの最初のbashのキーワードだけを置き換えれば、blueshellは終了します.
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'   
1
5多点編集
一つのsedコマンドは、/etc/passwdの3行目から末尾までのデータを削除し、bashをblueshellに置き換えます.複数のsed名を実行するのに相当します.
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1
-eは多点編集、第一編集コマンド削除/etc/passwd第三行から末尾までのデータを示し、第二条コマンド検索bashはblueshellに置き換えられます.
6危険動作
上記の操作は元のファイルの内容を変えません.上の操作は全部モード空間で行われるからです.
sedはファイルの内容を直接修正することができます.バンド-iパラメータが必要です.
sedを利用してレグラーを_express.txt内の各行が終わると.に換える!
sed -i 's/\.$/\!/g' regular_express.txt
1
sedを利用して直接reglar_にいます.express.txt最後の一行は『啝This a test』に参加します.
sed -i '$a # This is a test' regular_express.txt
1
$は最後の行を表していますが、aの動作は新しくなりましたので、このファイルは最後に『驫This a test』を追加しました.
sedの『-i』のオプションはファイルの内容を直接変更することができます.この機能は非常に役立ちます.例えば、100万行のファイルがあれば、100行目に何かの文字を追加したいです.ここでvimを使うと狂ってしまうかもしれません.ファイルが大きすぎるからです.どうすればいいですか?sedを利用しますsedを通して直接に機能を修正します.また、vimを使って修正する必要もありません.