こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

cshが詳しい方は教えてください

cshが詳しい方は教えてください
cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが
foreach f_list("`cat tmp.out`")
echo "${f_list}"
end
tmp.outの内容は以下です。
test3
if ( 0==mencmp("H",HOSTN,10) {
test345
testddd

2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。
『}が足りません。』ってのエラーになっちゃう、

"{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか

以上です。よろしくお願いいたします。

投稿日時 - 2010-06-24 10:43:28

QNo.5991377

すぐに回答ほしいです

質問者が選んだベストアンサー

> 一応tcshに試しましたが、やっぱりだめでした。
> エラー内容:間違った}です.

おかしいですね?
こちらのtcsh(ver.6.17.00と6.15.00)ではtmp.outと同じ内容が表示されましたが。
tcsh ~.csh
とかやって、ちゃんとtcshで動かしてますか?
対話シェルはtcshにしたけど、1行目が
#!/bin/csh
とかなってるのを
./~.csh
で実行したとか、
csh ~.csh
と実行したとかはないですよね?
# もしかしたら、古いtcshでは同じ現象が起るのかもしれませんが、確認はしていません。

> プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
> その行の内容を別のファイルに出力する機能です。

単純に
grep 'キーワード' tmp.out > t.out
ではだめですか?(キーワードに正規表現の特殊文字が含まれていないとして) awk使うにしても、こんなまわりくどいことしなくても
awk '/キーワード1/{print} /キーワード2/{print} ' tmp.out > t.out
とかできますし。

投稿日時 - 2010-06-24 22:40:37

お礼

kmeeさん
いろいろご回答してくれて、誠にありがとうございました
結局、一部の計算機能をやめて、内容だけ、ファイルに出力する方式に修正しました
『grep 'キーワード' tmp.out > t.out』のように修正しました
改めてありがとうございました。

投稿日時 - 2010-06-25 12:45:24

ANo.4

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

SunOS 5.8のcshで確認しました。
これは、バグといってもいい「仕様」なのでしょうね。
おそらく、"${f_line}"を展開した
echo if ( 0==mencmp("H",HOSTN,10) {
という行全体を eval している気がします。

対処法は次のものしか思いつきませんでした。

・他のシェルを使う
Bsh系にしましょう。
どうしてもCsh系を使いたいなら、せめてtcshを。(すくなくとも、この現象は発生しません)

・根本的にやりかたを見直す
1行ずつなんかの処理をしたいのでしたら、grep,sed,awk,perl、あるいはこれらの組み合わせで大抵のことはできます。

投稿日時 - 2010-06-24 18:43:12

補足

kmeeさん

詳しくご回答ありがとうございました
現在のところで、Bシェルに変更して、時間が許しませんが
一応tcshに試しましたが、やっぱりだめでした。
エラー内容:間違った}です.

それとも awkで試しましたがやっぱりだめでした。
set i=1
set maxGyo = `awk 'END{print NR}' temp.out`
while ($i <= $maxGyo)
set line = `awk "{ if (NR==$i) print}" temp.out`
echo "$line"
@ i++
end

エラー内容:}が足りません。

プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
その行の内容を別のファイルに出力する機能です。
元々のプログラムは下記のものです。
foreach f_list("`grep -n キーワード temp.out`")
echo "${f_list}" >> t.out
end

何かご存知でしたら、是非お願い申し上げます

投稿日時 - 2010-06-24 21:06:44

お礼

kmeeさん

詳しくご回答ありがとうございました
現在のところで、Bシェルに変更して、時間が許しませんが
一応tcshに試しましたが、やっぱりだめでした。
エラー内容:間違った}です.

それとも awkで試しましたがやっぱりだめでした。
set i=1
set maxGyo = `awk 'END{print NR}' temp.out`
while ($i <= $maxGyo)
set line = `awk "{ if (NR==$i) print}" temp.out`
echo "$line"
@ i++
end

エラー内容:}が足りません。

プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
その行の内容を別のファイルに出力する機能です。
元々のプログラムは下記のものです。
foreach f_list("`grep -n キーワード temp.out`")
echo "${f_list}" >> t.out
end

何かご存知でしたら、是非お願い申し上げます

投稿日時 - 2010-06-24 21:07:52

ANo.2

csh -x シェルファイル
とするとどうなりますか?

投稿日時 - 2010-06-24 18:39:15

お礼

ご回答ありがとうございました
やっぱりだめでした
前行の内容まで表示できて、end文字も表示しました、その後、}が足りません。
よろしくお願いいたします

投稿日時 - 2010-06-24 21:12:02

ANo.1

特殊文字なのは{じゃなくて$の方じゃないですか?
つまり2行目を
echo "$${f_list"
としてみたらどうかって事ですが。

投稿日時 - 2010-06-24 13:02:32

補足

D-Matsuさん
回答ありがとうございました。
試しましたが、やっぱりだめでした
grep.out4中の最後の{を切ると、旨くいきました
やっぱり、ファイル中の{の問題と思ってます。
それで、{の後ろに}を付けて、試して、旨くいきましたが、表示するとき、最後の二つ文字{}が表示できなくなりました。

投稿日時 - 2010-06-24 13:31:23

お礼

補足:
いろいろ試しましたが、cat,grepのコマンドの問題ではありません。
問題はバッククォーテーション(``)でcatを囲まれて、旨くいけません

投稿日時 - 2010-06-24 15:56:14

あなたにオススメの質問