• 締切済み

SJISファイルを日本語でgrep

UNIX環境で、 SJISファイルを日本語でgrepしたのですが、 ファイル名が出力されずにうまくいきません。 どなたかご教授願えないでしょうか。 [自分のコマンド] find ./ -type f -print | xargs nkf -e | grep 'テスト' とし、日本語は検地できたのですが、 ファイル名が出力されずに困っております。 grep -l としたら、↓のエラーが表示されました。 xargs: nkf: シグナル 13 によって終了しました サブディレクトリも含めて検地したいのですが、 なにかいい方法ありますでしょうか。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

grep --label でファイル名として表示される文字列を指定できます。 1ファイル毎に個別にgrepの起動が必要。 find . -type f -exec sh -c 'nkf -e {} | grep --label={} -H テスト' \;

prr4e
質問者

お礼

ありがとうございます。 無事なんとか解決できました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

訂正 誤: nkf -e | grep $1 | sed "s|^|$2:|" 正: nkf -e $2 | grep $1 | sed "s|^|$2:|"

prr4e
質問者

補足

ありがとうございます。 試してみます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

grepで、ファイルからではなく標準入力から検索しているので、ファイル名が出なくて当り前です。 grepが検索しているのは、xargsコマンドの標準出力であって、特定のファイルではありません。 また、xargsでは、nkf -e に複数のファイルを指定するようなものなので、各ファイル毎という処理には向いていません。 何らかの方法で、ファイル名と出力を結びつける必要があります。 例えば find . -type f -exec sed 's|^|{}:|' \{\} \; | nkf -e | grep -a 'テスト' findでファイルを検索→sedで先頭をファイル名に置き換えるたものを標準出力 (findの-execでは{}がファイル名の置き換わる) → nkf -e でEUC-JPにしたものを標準出力 →grepで検索 とか。 nkf -e | grep $1 | sed "s|^|$2:|" をgrep-euc.shとして find . -type f -exec grep-euc,sh 'テスト' \{\} \; とするとか ファイル名に日本語が含まれていると、誤動作するかもしれませんが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そりゃぁそんなコマンド打ったらファイル名など出力されるはずもありませんが.... そもそも何をしたいのでしょうか?

回答No.1

パイプの最終段が grep 'テスト' になっている限り、途中で何をしても無駄。 grepは「標準入力から受け取った行に『テスト』と文字があるかどうか」しか判断しない。 受け取った行が「ファイル名の表示」なのか「ファイルの中身」なのか、そんな事は判らないし、知ったこっちゃない。 もし「ファイル名を表示させたい」なら、grepのパターン式に「ファイル名表示行に一致する検索パターン」も指定しないといけない。 例えば、grepよりも前のコマンドが、ファイル名表示を File Name : ほげほげ と言う表示をするのであれば、grepには「『テスト』の他に『File Name : 』で始まる行も出せ」と指示しないといけない。

prr4e
質問者

お礼

ありがとうございます。 やはりファイル名を指定しないといけないんですね。 ですが、ファイル名が分からないので、 走せざるを得ないんですが、 ファイル名を一旦取得した、そのファイル名から grep するしかないですかね。

関連するQ&A