UNIXシェルスクリプト第7章 Part2

sedを使っての編集

sed -e "s/^TextToRemove//"

^ は行の先頭を表す。^abcという指定にすれば、行の先頭にabcという文字列がある場合、という意味になる。

先頭のみを指すので、gは付ける必要がない。

 

sed -e "s/TextToRemove\$//"

$は行の末尾を表す。$はシェルの特殊文字なので、\ をつけてエスケープさせる。

 

sed -e "s/^/TextToInsert/"

行の先頭をTextToInsertで置き換えるという感じ。

これで行の先頭に文字列を追加できる。

 

sed -e "s/\$/TextToAppend/"

行の末尾をTextToAppendで置き換えるという感じ。

これで行の末尾に文字列を追加できる。

 

sed -e "s/^...//"

. は任意の1文字を表す。つまり ^... は先頭の3文字を表す。

 

sed -e "s/a*//"

* は直前の文字が任意の個数連続した場合を表す。

つまり a* はヌル、a、aa、aaa、...を表す。

よってどんな文字であれ、 .* で表現できる。

 

sed -e "s/Pattern1.*Pattern2//"

Pattern1から始まってPattern2で終わる文字列を消去する。

応用で様々なパターンがある。

s/e.....//    eから6文字を消去

s/.*s//    sという文字までを消去

s/.*/XYZ/    すべての行をXYZに置換

s/(.*)/()/    括弧の中の文字列を消去

 

USER=`id | sed 's/uid=.*(\(.*\)) gid=.*/\1/'`

\( と\) で囲んだ部分は \1 や \2 で指定できる。

つまり括弧で括った部分だけを取り出すことができる。

 

echo "$STRING" | cut -c1-5

cutコマンドは指定された部分を切り取る。

-c1-5は文字目から5文字目までを切り取る。

 

awk '{printf "%-.5s\n", $0}' < file

行頭から5文字だけを取り出す。

 

$ cat file | tr '[A-Z]' '[a-z]' > lowerfile

大文字を小文字に変換する。

 

$ sed -e 's/<space><space>*/<space>/g'

複数のスペースを1個のスペースに変換する。

<space>* とすると全部の文字の前にスペースが挿入されてしまう。

 

$ sed -e 's/[<space><tab>][<space><tab>]*/<space>/g'

ホワイトスペースを1個のスペースに変換する。

 

$ sed -e "/Text/d"

Textという文字列を含んだ行を削除する。

置換ではないのでsはいらない。最後にdeleteを意味するdを指定する。

grepコマンドを使うと

$ grep -v "Text" と同じ。

 

$ sed -e '/^$/d'

空白行を削除する。

スペースやタブも含めた削除をしたい場合は

$ sed -e '/^[<space><tab>]*$/d'

 

$ sed -e "5,20s/OldText/NewText/g" file

この場合5から20行目を処理する。

最後がわからない場合は5,$とすれば大丈夫。

 

 $ sed -e '1d' file

ファイルの1行目を削除する。

 

$ sed -e '1,4d' file

ファイルの最初の4行を削除する。

 

$ sed -e '$d' file

ファイルの最終行を削除する。

 

$ sed -e '$-3,$d' file

ファイルの最後の4行を削除する。

$-3は最後から数えて3行目。

 

$ sed -n '1p' file

1行目だけを表示する。

-nオプションは指定した行を表示する。

 

$ sed -n '1,np' file

1行目からn行目までを表示する。

この書き方に限っては特殊な手法がある。

$ sed -e 'nq' file

こうすればn行目まで表示し、sedが終了(quitのq)する。

 

$ sed -e '/Begin/,/End/d' file

Beginを含む行からEndを含む行までを削除する。

 

$ sed -n '/Begin/,End/p' file

Beginを含む行からEndを含む行までを表示する。

 

$ grep -n '.*' | sort -n -r | sed 's/^[0-9]*://'

grepコマンドに-nオプションを用いて各行に行番号を付ける。

grepコマンドは標準入力からファイルを読み、指定したパターンに一致する文字列を含む行を出力する。その際、sedと同じ .* という表現ですべての文字列を指定する。

出力は以下のようになる。

1:line1

2:line2

3:line3

.....

これをsortコマンドで番号順に逆順に並べる。

-rオプションで逆順にソートできる。

最後にsedコマンドで行番号を消して表示すればファイルを後ろから表示できる。

 

第7章終了。