Linuxのコマンドを「やりたいこと」でまとめました。「やりたいこと」を実行するためのコマンドと使用例を掲載しています。コマンドの基本を学びたい方は「Linuxコマンド道場」を参照ください。ファイルの操作からテキスト・ファイルの処理方法まで,例題に基づいて学べます。

 Linuxコマンド逆引き大全
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス

 文字列を置換する
$ sed -e s/command/コマンド/g target_file > output_file

 文字列の置換には「sed」コマンドを用いる。上の例では,target_file中にある文字列「command」を「コマンド」にすべて置き換え,output_fileに保存する。「-e s/検索パターン/置換パターン/g」で置換する文字列を指定する。検索パターンには正規表現を利用できる。詳しくは「どのような正規表現があるのか」を参照。

 また,以下の表のような置換パターンを使用できる。


パターン 意味
\n 検索パターンで\(...\)を用いて保存したパターンを呼び出す
& 検索パターンを呼び出す
\\ \文字を表す
\& &文字を表す


 応用:「2003/10/20」という日付表記を「2003年10月20日」に置き換える
$ sed -e "s/\([0-9]\{4\}\)\/\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)/\1年\2月\3日/g" target_file > output_file

 正規表現の部分は,分かりにくいので,色分けを施して,順に解説する。


s/\([0-9]\{4\}\)\/\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)/\1\2\3日/g

 青色で示した「\(」と「\)」がセットになり,間にはさまれた赤色の部分を検索パターンとして登録している。検索パターンは3つある。このパターンを置換部分で,「\1」,「\2」,「\3」として呼び出している。検索パターンの部分を理解するには,「\{」+数字+「\}」という書式を理解しておかなければならない。この書式を使うと,指定した数字の回数の繰り返しと一致させることができる。つまり,最初の検索パターンは,0から9(つまり数字)の4回の繰り返し,次のパターンと最後のパターンは,数字の1回か,もしくは2回の繰り返しと合致する。なお,「\/」は,「s/検索パターン/置換パターン/g」という構文に用いている「/」と区別するための工夫である。表にある「\\」や「\&」と同じ\記号の使い方である。このようにして,xxxx/xx/xxという文字列をxxxx年xx月xx日に置き換えることができた。


 応用:Perlで文字列を置換する

 プログラミング言語の処理系の一種であるPerlを使えば,より複雑な文字列処理を行える。「perl」コマンドは,コマンド1行で処理を完結することもできるが,プログラム・ファイルを作って使用した方が間違いが起きにくい。例えば,テキスト・ファイル中の文字列を置換したい場合は,以下のようなプログラムを記述して,rep_str.plといった名前のファイルとして保存する(ただし,行番号は付けないこと)。


 1: #!/usr/bin/perl
 2:
 3: if ( ! open ( OF, "<$ARGV[2]") ) {
 4: print "File not found.\n";
 5: exit(-1);
 6: }
 7: while (){
 8: $_ =~ s/$ARGV[0]/$ARGV[1]/g;
 9: print $_;
10: }
11: close(OF);

 置換処理をしているのは8行目である。コマンドの第0引数を検索文字に,第1引数を置換文字として扱っている。

 この後,ファイルを実行できるようにアクセス権限を変更する。


$ chmod 755 rep_str.pl

 このプログラムの実行は,


$ ./rep_str.pl 検索文字 置換文字 target_file

で行う。ただし,結果は標準出力に出されるため,ファイルに保存するにはリダイレクトで書き込むようにする。


$ ./rep_str.pl 検索文字 置換文字 target_file > output_file

 なお,このプログラムは引数に正規表現を用いることができる。

 8行目の置換処理を変更することにより,より複雑な処理にも対処できる。例えば,Perlで「2003/10/20」という日付表記を「2003年10月20日」に置き換える,という例では3行目と8行目を,


3: if ( ! open ( OF, "<$ARGV[0]") ) {
8: $_ =~ s/([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})/$1年$2月$3日/g;

とすればよい。