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; |
とすればよい。
関連事項 |
sed,tr,perl,ファイルから文字列を検索する,ファイルを編集する,どのような正規表現があるのか |