例題1を改良し,行番号付きで出力する cat
コマンドを作成してください.
クラス名はCat2
としてください.
ただし,例題1と異なり,複数のファイルを指定できるようにしましょう.
この例題でも,引数は必ず与えられるものとしてください.
$ cat -n Cat2.java
1 import java.io.*;
...途中省略.
23 }
$ java Cat2 Cat2.java Cat.java
1 import java.io.*;
...途中省略.
23 }
1 import java.io.*;
...途中省略.
19 }
ここでは,grep
コマンドを作成しましょう.grep
コマンドとは,
キーワードと1つ以上のファイル名が与えられます.
ファイルの行にキーワードが含まれていれば,その行を出力するコマンドです.
クラス名はGrep
としてください.
結果出力には,以下の出力例のようにファイル名も含めてください.
複数のファイルが与えられたとしても,検索できるようにしましょう.
なお,キーワードは省略されることはなく,ファイルは少なくとも1つは指定されるとして構いません.
ある文字列(stringA
)に,別の文字列(stringB
)が含まれているかを
確認するには,contains
メソッドを利用してください.
String stringA = "this is a pen";
String stringB = "is a";
String stringC = "are";
if(stringA.contains(stringB)){
System.out.println("このメッセージは表示される.");
}
if(stringA.contains(stringC)){
System.out.println("このメッセージは表示されない.");
}
$ grep line Cat.java
String line;
while((line = in.readLine()) != null){
System.out.println(line);
$ java Grep line Cat.java
Cat.java: String line;
Cat.java: while((line = in.readLine()) != null){
Cat.java: System.out.println(line);
$ java Grep class Cat.java Cat2.java
Cat.java: public class Cat{
Cat2.java: public class Cat2{
指定された行数だけファイルの先頭から出力するコマンドhead
を作成しましょう.
コマンドライン引数では,行数とファイル名を受け取ってください.
ただし,ファイル名は省略可能です.ファイル名が省略された場合,標準入力から読み込むようにしてください.
クラス名は Head
としてください.
コマンドライン引数が1つしか与えられなかった時に,標準入力(System.in
)から受け取るようにするには,
次のようなコードで BufferedReader
を構築してください.
標準入力,標準出力については,基礎プログラミング演習IIの講義資料を確認してください.
BufferedReader in;
// コマンドライン引数が1つしか与えられなかった場合.
if(args.length == 1){
in = new BufferedReader(new InputStreamReader(System.in));
}
else{
in = new BufferedReader(new FileReader(args[1]));
}
$ head -3 Cat.java # Cat.java の先頭3行を出力する.
import java.io.*;
public class Cat{
$ java Head 3 Cat.java # Cat.java の先頭3行を出力する.
import java.io.*;
public class Cat{
$ cat Cat.java | java Head 4 # 入力を標準入力から受け取る
import java.io.*;
public class Cat{
void run(String[] args) throws IOException{
cat Cat.java | java Head 4
とコマンドを実行した時に,標準入力から入力を受け取ることになります.
そうでない場合(ファイルをコマンドライン引数で指定した場合)は, java Head 3 Cat.java
のようなコマンドの入力になります.
ここでは,tee
コマンドを作成しましょう.tee
コマンドは
標準入力で受け取った文字列を標準出力と,指定されたファイルに出力するコマンドです.
以下の図のように T の形に入力を分配するところから名付けられています.クラス名をTee
としてください.
コマンドライン引数にファイル名を受け取ってください.
また,標準入力から値を受け取るようにしましょう.上記のようにBufferedReader
を
構築した後は,Cat
の時と同じように入力を受け取れば良いです.
入力が終わればnull
が返ってきますので,自動的にループを抜けるようになっています.
$ cat hoge # hoge というファイルがないことを確認する.
cat: hoge: No such file or directory
$ cat Cat.java | java Tee hoge # 標準出力と hoge に出力する.
import java.io.*;
...途中省略
}
$ cat hoge # hoge の内容を確認する.
import java.io.*;
...途中省略
}