標準入力からデータを受け取って編集後の結果を標準出力に書き出します。
cat samplefile
OldTextjahjsaOldTextajs
mmmnnnn
hasjhOldTexthajshsed -e "s/OldText/NewText/" samplefile
NewTextjahjsaOldTextajs
mmmnnnn
hasjhNewTexthajsh結果を残す場合は、リダイレクトさせます。
sed -e "s/OldText/NewText/" samplefile > resultfilesedにつけた-eというオプションは、その後の文字列が編集用のコマンドだということ
を表します。
sは置き換え(substitute)の意味です。s/OldText/NewText/と書くことで、
2つの文字列の左側の文字を右側の文字に置き換えます。
1行の中で見つけた文字列を全て置き換える場合には
s/OldText/NewText/gと指定します。
sed -e "s/OldText/NewText/g" samplefile
NewTextjahjsaNewTextajs
mmmnnnn
hasjhNewTexthajsh-nコマンドは指示した行のみ実行するように指定できます。
sed -n '2p' < samplefile
mmmnnnnsed -n '3p' < samplefile
hasjhOldTexthajsh置き換えた行のみ表示する場合は以下のようになります。
sed -n -e "s/OldText/NewText/gp" samplefile
NewTextjahjsaNewTextajs
hasjhNewTexthajshcat samplefile |
sed -e "s/OldText/Newtext/g" |
sed -e "s/mmm/MMM/g" |
while read LINE
do
echo $LINE
done出力結果⏬
NewtextjahjsaNewtextajs
MMMnnnn
hasjhNewtexthajshsedコマンドのデリミタ/は変更可能です。
sの後の次の文字がデリミタとして認識される仕様となっており、
慣習的に/が使われますが、%や@を使っても問題ありません。
cat samplefile |
sed -e "s%OldText%Newtext%g"
NewtextjahjsaNewtextajs
mmmnnnn
hasjhNewtexthajshsed -e "s/OldText/NewText/g"gがあれば、行の全てを対象(globallyの略)にします。
sed -e "s/TextToRemove//g"何もない文字列に返還させると文字列を結果的に削除できます。
sed -e "s/^TextToRemove//"行頭の文字が指定した文字列に一致すれば削除する例です。
sed -e "s/TextToRemove\$//"sed -e "s/nnnn/nnnnAddText/" samplefile
OldTextjahjsaOldTextajs
mmmAddText
hasjhOldTexthajshnnnnという文字列の後にAddTextという文字を追加します。
sed -e "s/^/AddText/" samplefile
AddTextOldTextjahjsaOldTextajs
AddTextmmmnnnn
AddTexthasjhOldTexthajshsed -e "s/\$/AddText/" samplefile
OldTextjahjsaOldTextajsAddText
mmmnnnnAddText
hasjhOldTexthajshAddText.には任意の1文字の意味があります。シェルの特殊文字?と似たような働きを持ちます。
sed -e "s/^...//" samplefile
TextjahjsaOldTextajs
nnnn
jhOldTexthajsh行頭の3文字を削除しています。
*は直前の文字が任意の個数連続した場合(0も含む)を表します。
a*という指定は、a、aa、aaaaaなどaが任意の個数続く文字列を表します。
.*を指定すると、任意の文字列を表します。
sed -e "s/.*/abcd/" samplefile
abcd
abcd
abcd.*は全ての文字列に当てはまるため、行を全て、abcdに置き換えます。
以下のファイルがあるとします。
cat file
abcdefghijklmn
opqrstuvwxyz
0123456789
abc(defgh)aijkl
mn(op)qrstuvwxyze以降の5文字をABCに置き換えます。
sed -e "s/e...../ABC/" file
abcdABCklmn
opqrstuvwxyz
0123456789
abc(dABCijkl
mn(op)qrstuvwxyzsを含めsより前の文字を切り取り
sed -e "s/.*s//" file
abcdefghijklmn
tuvwxyz
0123456789
abc(defgh)aijkl
tuvwxyz全ての行をXYZに置き換えます。
sed -e "s/.*/XYZ/" file
XYZ
XYZ
XYZ
XYZ
XYZカッコの中の文字を全て消去
sed -e "s/(.*)/()/" file
abcdefghijklmn
opqrstuvwxyz
0123456789
abc()aijkl
mn()qrstuvwxyzidコマンドから最初のuidを取り出す。
id | sed -e "s/uid=//" -e "s/(.*//"idコマンドから最初のユーザー名を取り出す。
id | sed 's/uid=.*(\(.*\)) gid=.*/\1/'\1は丸括弧で囲んだ部分を1つ目を取り出せる。
丸括弧は文字列として扱われないようにエスケープする。
echo "$STRING" | cut -c1-5#!/bin/sh
STRING=abcdefghijklmlopqrstuvwxyz
FIRST=1
LEN=5
echo $STRING | cut -c$FIRST-$LEN行頭FIRST番目からLEN文字分を切り取ります。
awk '{printf "%-.5s\n", $0}' < file
abcde
opqrs
01234
abc(d
mn(opsedコマンドでは以下のようになります。
sed -e "s/^\(.....\).*/\1/" file
abcde
opqrs
01234
abc(d
mn(opcat file | tr '[A-Z]' '[a-z]' > lowerfilecat file
abcdefghijklmn
opqrstuvwxyz
0123456789
abc(defgh)aijkl
mn(op)qrstuvwxyzcat file | tr '[a-z]' '[A-Z]'
ABCDEFGHIJKLMN
OPQRSTUVWXYZ
0123456789
ABC(DEFGH)AIJKL
MN(OP)QRSTUVWXYZアルファベットだけを変換し、数字やその他の文字は変換しません。
sed -e 's/<tab>/<space>/g'sed -e 's/<space><space>*/<space>/g'ホワイトスペースとはタブかスペースのことです。
タブやスペースが混在している場合に1個のスペースに変えるには以下のようにします。
sed -e 's/[<space><tab>][<space><tab>]*/<space>/g'鉤括弧でどちらかを表現できます。
sed -e 's/^[<space><tab>]*//'sed -e 's/<space><tab>]*$//'ダブルクォートで囲った場合は$をエスケープします。
sed -e "s/<space><tab>]*\$//"Testという文字列を削除する場合の例です。
sed -e "/Test/d"cat samplefile
OldTextjahjsaOldTextajs
mmmnnnn
hasjhOldTexthajshsed -e '/OldText/d' samplefile
mmmnnnngrep -vで該当する文字列を含んだ行を表示しないという意味になります。
そのため、以下でも同じことができます。
cat samplefile | grep -v "OldText"
mmmnnnn何行目から何行目までを編集するといった指定も可能です。 2から3行目を書き換える場合は以下のように記述します。
sed -e "2,3s/OldText/NewText/g" samplefile
OldTextjahjsaOldTextajs
mmmnnnn
hasjhNewTexthajsh指定されていない行については何もしません。
1行目を削除する場合は以下のように書けます。
sed -e '1d' samplefile
mmmnnnn
hasjhOldTexthajsh最終行を削除する場合は以下です。
sed -e '$d' samplefile
OldTextjahjsaOldTextajs
mmmnnnn2行目から最終行までを表示しないようにするので、1行目を表示することになります。
sed -e '2,$d' samplefilesed -n '1p' samplefilesed -n '$p' samplefilesed -n '1,2p' samplefile以下のようなファイルがあるとして、
cat samplefile2
OldTextjahjsaOldTextajs
mmmnnnn # comment
# vvvvxxxx
hasjhOldTexthajsh先頭に#がある行を削除したい場合は、以下となります。
sed -e '/^#/d' samplefile2
OldTextjahjsaOldTextajs
mmmnnnn # comment
hasjhOldTexthajshまた、途中で#が出てくる行のコメントも削除したければ以下で良さそうです。
sed -e 's/#.*//' samplefile2 | sed -e '/^$/d'
OldTextjahjsaOldTextajs
mmmnnnn
hasjhOldTexthajsh#以降の文字を空に置き換えます。
ただそれだけでは、# vvvvxxxxの行が空行として残ってしまうため、
空行を削除しています。
cat fileaa
xxxxxxxxxxxxxxxxxxxxxx
Beginaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
ddddddddddEndddddddddd
eeeeeeeeeeeeeeeeeeeeeeBeginとEndで囲まれた部分の行を表示するには、 行数指定すれば
sed -n '2,5p' fileaa削除する場合は、
sed -e "2,5d" fileaaと書けますが、
/StartingPattern/,/EndingPatternというパターンを使い、
キーワードを使った行指定も可能です。
sed -n "/Begin/,'End/p" fileaased -e "/Begin/,/End/d" fileaaまた、キーワードがキーワードの行のみ
cat filebb
xxxxxxxxxxxxxxxxxxxxxx
Begin
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
dddddddddd
End
ddddddddd
eeeeeeeeeeeeeeeeeeeeeeのようになっている場合は、
sed -n "/^Begin\$/,/^End\$/p" filebbとすることで、もし意図しないところにキーワード(ここではBegin、End)がある場合にも 対応できるため確実です。
cat filebb | grep -n '.*' | sort -n -r | sed 's/^[0-9]*://'まず、grepコマンドに-nオプションを用いて、行番号をつけます。
その際に全ての文字列に一致する.*を指定して、全ての行を出力します。
cat filebb | grep -n '.*'
1:xxxxxxxxxxxxxxxxxxxxxx
2:Begin
3:aaaaaaaaaaaaaaaaa
4:bbbbbbbbbbbbbbbbbbbbbb
5:cccccccccccccccccccccc
6:dddddddddd
7:End
8:ddddddddd
9:eeeeeeeeeeeeeeeeeeeeeesortコマンドで逆の番号順に並べます。
cat filebb | grep -n '.*' | sort -n -r
9:eeeeeeeeeeeeeeeeeeeeee
8:ddddddddd
7:End
6:dddddddddd
5:cccccccccccccccccccccc
4:bbbbbbbbbbbbbbbbbbbbbb
3:aaaaaaaaaaaaaaaaa
2:Begin
1:xxxxxxxxxxxxxxxxxxxxxx最後に不要な番号とコロンを削除します。
cat filebb | grep -n '.*' | sort -n -r | sed 's/^[0-9]*://'
eeeeeeeeeeeeeeeeeeeeee
ddddddddd
End
dddddddddd
cccccccccccccccccccccc
bbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaa
Begin
xxxxxxxxxxxxxxxxxxxxxx