使い方
参考:
sed – テキストの置換処理を得意とするスクリプト言語 | bioinformatics
あえていうほどでもない sed 入門 | TECHSCORE BLOG
sed コマンド – 使い方まとめ | RAKUS Developers Blog
sed コマンド – 正規表現を使って文字を置き換える | @IT
オプション
ドキュメント:
コマンド
d
:削除するp
:出力するs
:置換する
ドキュメント:
パターン処理
パターンに合致した行のみ表示する。
$ cat input.txt | sed -n -e '/pattern/p'
開始パターンに合致した行から終了パターンに合致した行の範囲を表示する。
$ cat input.txt | sed -n -e '/start/,/end/p'
パターンに合致した行から3行のみ表示する。
$ cat input.txt | sed -n -e '/pattern/,+2p'
パターンに合致しなかった行のみ表示する。
$ cat input.txt | sed -n -e '/pattern/!p'
ドキュメント:
参考:
Understanding how range addresses work – Unix & Linux Stack Exchange
範囲指定
ドキュメント:
参考:
Delete range of lines above pattern – Unix & Linux Stack Exchange
メタ文字
\d
:[0-9]
\w
:[0-9a-zA-Z_]
参考:
文字クラス
参考:
Character Classes and Bracket Expressions | sed
POSIX
- スペース:
[[:space:]]
参考:
How to match whitespace in sed? – Super User
置換
s
コマンド (s/before/after/g
) を用いて、文字列を置換する。
$ echo "Hello, NAME" | sed -e "s/NAME/John/g"
参考:
文字列置換 bash / sed について! | Beエンジニア
最短一致
sed
コマンドには最短一致の機能は存在しない。代わりにクラスの否定を使う。
[^X]+
:1つ以上のX
以外の文字にマッチする。
参考:
最長一致、最短一致 についての考察 | ソーシャルゲーム基盤
後方参照
置換の際に、(.*)
などの丸括弧で囲んだ部分が一致した値を \1
, \2
, … で利用することができる。
参考:
正規表現で一致した値を再利用して置換する | goodbyegangster のブログ
スペースを取り除く
参考:
How to match whitespace? – Super User
空行を取り除く
$ cat file.txt | sed '/^$/d'
参考:
ファイルや複数行文字列の末尾の余計な空白行や改行を消す | rcmdnk’s blog
改行に置き換える
BSD sed の場合、エスケープのためのバックスラッシュ \
の後、一旦クォートを閉じて、ANSI-C クォーティングで囲った改行 $'\n'
を入力し、その後にクォーテーションで囲って元の続きを書く。
$ sed -E 's/hoge/\'$'\n''/g'
GNU sed の場合、普通の \n
で良い。
$ sed -E 's/hoge/\n/g'
参考:
Mac の sed で改行コードを出力させる 改行コードの違い再確認 – Qiita
改行を置換する
参考:
ファイルや複数行文字列の末尾の余計な空白行や改行を消す | rcmdnk’s blog
ファイルの最終行が空行だった場合のみ、その行を削除する | 俺的備忘録
replace newlines within a string range – Unix & Linux Stack Exchange
キャリッジリターンを取り除く
参考:
Remove carriage return – Stack Overflow
CR を CRLF に置き換える
参考:
How to add a carriage return before every newline? – Unix & Linux Stack Exchange
行頭に文字列を追加する
参考:
タブを置換する
参考:
BSD / Mac の sed でのタブ文字を変換する 3つの方法 | rcmdnk’s blog
シェル変数を展開して使う際のエスケープ
参考:
変数に代入されている & 等のメタ文字のエスケープ処理を行いたい – teratail
パターンに合致した行に追記する
参考:
特定の範囲のみ出力する
1行目から5行目を表示する。
$ cat input.txt | sed -n -e '1,5p'
置換して合致した行のみ出力するには、-n
オプションを指定して p
コマンドを使う。
$ cat input.txt | sed -nE "s/^#\\s*//p"
参考:
sed でマッチした行だけ標準出力する | pig’s diary
sed の結果を使ってコマンドを実行する – sed コマンド 応用編 | @IT
print only matching group – Stack Overflow
return matched string – Unix & Linux Stack Exchange
パターンに合致した行の前後を処理する
参考:
ある行の n 行前から処理対象にする | grep Tips *
How to append line after a range match – Stack Overflow
search a range and print first set – Stack Overflow
最終行のみ処理する
※ BSD sed で処理すると必ず最後に改行が入る。(仕様)
参考:
ファイルの最終行が空行だった場合のみ、その行を削除する | 俺的備忘録
ファイルの最初 or 最後の行に挿入/追記する | 俺的備忘録
ファイルの最後の行だけを置換する | akamist blog
最終行が特定の文字列の場合のみ行削除! | mk-mode BLOG
改行を挿入する形で置換しようとしたとき、最後に余計な改行が入る – スタック・オーバーフロー
特定の行を削除する
- 特定の行を削除するには、
d
コマンドを使用する。
使い方
1行目から5行目を削除する。
$ cat input.txt | sed -e '1,5d'
パターンに合致した行を削除する。
$ cat input.txt | sed -e '/pattern/d'
参考:
sed コマンド – 基礎編その2/行番号、パターンを指定して削除する | @IT
最後の行を削除する
最終行の行番号を表す $
を用いて、d
コマンドで最終行を削除する。
$ cat input.txt | sed -e '$d'
最後の数行を削除する場合、簡潔に記述できるコマンドは存在しないため、head
コマンドを使う方がよい。
$ cat input.txt | head -n -3 > output.txt
参考:
テキストの最後の行を削除した内容がほしい | softel メモ
パターンに合致した次の行を削除する
パターンに合致した次の行を削除するには、パターンに n
コマンドと d
コマンドをグループ化して適用する。
$ cat input.txt | sed -e '/pattern/{n;d;}'
参考:
パターンに合致した次の行に文字列を追加する
参考:
指定した行の次の行に任意の文字列を追加する | kakakikikeke のブログ
指定した個数飛ばしに処理する
参考:
n回目に出現する文字を置換する方法 – スタック・オーバーフロー
sed with next line (`+N` option) and frequency (`~N`) together – Unix & Linux Stack Exchange
特定の行以降を出力する
パターンに合致した行から最終行までを出力する。
$ cat input.txt | sed -n -e '/pattern/,$p'
参考:
How to print a range of line to end of file – Stack Overflow
特定の範囲を結合する
参考:
joining a range of selected lines – Stack Overflow
特定の範囲を逆順に表示/処理する
参考:
line number range with an ‘inverted’ range specified – Stack Overflow
各行の先頭に行番号を挿入する
sed
コマンドで行番号を付与するには、=
コマンドで行番号を出力し、改行を空白に置き換える。
$ cat input.txt | sed -e '=' | sed -e 'N; s/\n/ /'
awk
コマンドを使う場合は、printf
で出力するだけでよい。
$ cat input.txt | awk '{ printf "%d %s\n", NR, $0 }'
参考:
How can I prepend a line number and tab to each line of a text file? – Super User
Insert line numbers into file with sed – Stack Overflow
パターンスペース/ホールドスペース
参考:
パターンスペース/ホールドスペースの動作を図で学ぶ – Qiita
GNU / BSD / オプションによるメタ文字の違い (BRE / ERE)
基本正規表現 (BRE)
-E
オプションなしで実行した場合の挙動
\(\)
:グルーピング (エスケープが必要)\{n,m\}
:n 回から m 回の出現を表す (エスケープが必要)
拡張正規表現 (ERE)
-E
オプションありで実行した場合の挙動
.
:任意の一文字を表す?
:0回もしくは1回の出現を表す|
:任意のパターンのいずれかを表す
参考:
正規表現で + がイメージと違う動作をします – teratail
Mac / BSD 版の違い
参考:
Mac 環境で sed を使うときの注意 | tjinjin’s blog
ワンライナー
参考:
ワンライナーでお手軽実行可能な sed 入門 – Qiita
ドキュメント
sed – a stream editor | GNU.org
まとめ/Tips
sed コマンドの使い方まとめ/置換/行挿入/行削除など | hara-chan.com