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/(.*)/()/ 括弧の中の文字列を消去
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コマンドで行番号を消して表示すればファイルを後ろから表示できる。