>>4465 68user > と思ったのですが、最終行が出ません。 あー、ループ部分がサブシェルになってるからか。 while read -r line; do ... done < file.txt なら OK ですね。 やはり sh でプログラムなんて書くもんじゃないと思う。誰か Sh Programming Considered Harmful を書いてください。 |
>>4466 68user 補足。Solaris の sh では > while read -r line; do > done < file.txt でもダメなようですね。 http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936 |
>> 4467 ありがとうございます。 > while read -r line; do > done < file.txt はやはりダメでした。 while read line; do done < file.txt としたら上手く動きました。 また、 tmpline=`echo -n $line|sed 's/^ *//g'` では、1行になるのですが、「-n」オプションが邪魔みたいで、上手く編集 できませんでした。 tmpline=`echo $line|sed 's/^ *//g'` としたら上手くいきました。 |
>> 4468 sed 一発で簡単にできるものなのでしょうか。 |
>>4469 お 完璧ではないですが、こんな感じで。 ------ sed -e '/^[^ ]\{1,\}/ { N } s/^\([^ ]\{1,\}.*\)\n \{1,\}\([^ ]\{1,\}\)/\1\2/g' file.txt ------ >>4468 お >while read line; do >done < file.txt >としたら上手く動きました。 これだけで動きますか? whileの前に exec 0<file.txt とか要りませんでしたっけ? >>4466 68user >やはり sh でプログラムなんて書くもんじゃないと思う。誰か > Sh Programming Considered Harmful >を書いてください。 私は、どの程度の事までをシェルスクリプトでやるべきか悩みます。 Perlとか使った方が絶対に効率が良かったりするのに、 何故かシェルスクリプトにこだわる人とかいるし・・・ (で、気がつくと自分以外に判らないスクリプトが出来上がっていると。) |
>>4463 68user お返事いただきありがとうございます。 書きかけだった部分、もう削除しておられますが、いずれまとまった形で 復活するのを期待しています。 fgrep の話、面白いですね。man の記述の違いも。 でもこれ、何となく「fast = (使うのに)手っ取り早い」って訳すと つじつまが合うような気がしてきました。quick というのも同様。 正規表現を無効にする(できる)点をアピールする感じで。 で、誤解が生じてしまったので表現を改めた、とか。 勝手な推測ですが。 > http://www.bsddiary.net/doc/hierarchy.txt > 熟練者: 誰かが速いと言ったのでfgrepを使っている > ハッカー: 自分で時間を測った結果egrepを使うことにした の原文は http://groups.google.co.jp/group/net.jokes/msg/c49a0c0849fe8bb6 だと思うのですが、これより前に投稿されている http://groups.google.co.jp/group/net.jokes/msg/c24e7dccf82df3ff と比べてやけに grep まわりが強調されてますね。 > オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを > いれるわけにもいかず、なかなか大変です。 でも今のまんまだと、矛盾が生じちゃってます(↓)。 ;p http://x68000.q-e-d.net/~68user/unix/pickup?keyword=fgrep&target=command&partial=on®exp=on&case=off > 全角入りソースをコピペしやすいよう、半角空白に置換しています。 あ、それは理解してたんですが、 [使い方]ページに「全角空白は 2 つ分の半角空白(…)に置換されます。」 とあるのに、どうして行頭に入れた全角空白 1 個が「 4 つ」 に置換されちゃったんだろう? と思った次第です。 # 今回は全部半角空白にしてみた。 |
なるほど、半角空白 1 個が「 2 つ」になってるのか…。 失礼しました。 |
>>4462 お RFC2822 の folding を戻すのと大体同じですね。 sed -e ':loop' -e '$b' -e 'N;/\n /{s/\n *//;b loop' -e '};P;D;b loop' でどうでしょうか? 見やすくすると #!/usr/bin/sed -f :loop $b N /\n / { s/\n *// b loop } P D b loop |
>>4470 zsh >>4473 if ありがとうございます。 今、時間がありませんが、試してみます。 シェルスクリプトよりもPerlですか。 |
>>4470 zsh >これだけで動きますか? >whileの前に >exec 0<file.txt >とか要りませんでしたっけ? 要りませんでした。 while read line; do done < file.txt または、 while read line do done < file.txt で動きました。 |
>>4475 お Solaris9のsh |
>>4475 お Solaris9のshで確認しましたが、 やはりwhileの前に exec 0<file.txt を入れないと、最終行が表示されません。 恐らく、元のファイルの最終行が空行なので問題ないのだと思います。 >>68user様 記述途中で送信してしまい、大変失礼しました。 |
>>4455 68user ご指摘ありがとうございます。 スレッドセーフやマジックナンバなどは考えておりませんでした。 それと goto の部分は使いたくなかったのですが、うまくプログラムの流れを制御できなかったためやむなく使用しました。 確かに分かりにくいと思います。 今後修正してみようと思います。 かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。 |
>>4471 mkt > 書きかけだった部分、もう削除しておられますが、いずれまとまった形で > 復活するのを期待しています。 はい、そのうちまとめて更新したいと思います。 >>4477 zsh > やはりwhileの前に > exec 0<file.txt > を入れないと、最終行が表示されません。 わたくしのまわりには Solaris がないので試せませんが、これは何が原因で 最終行が表示されないのでしょうか? >>4478 DNS勉強中 > 今後修正してみようと思います。 > かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。 細かな指摘ですので修正は不要かと思います。もし DNS にこだわりがあるなら、 ライブラリ化したり、他のレゾルバのソースを読んだり、 http://www5d.biglobe.ne.jp/~stssk/dns.html を片っ端から実装するのがいいのではないでしょうか。 |
>>4479 68user >わたくしのまわりには Solaris がないので試せませんが、これは何が原因で >最終行が表示されないのでしょうか? パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。 Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを オープンしていました。 (ksh/bash/zshはサブシェルで動作しないので問題なし。) |
>>4480 zsh >パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。 >Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを >オープンしていました。 サブシェルで動作するとは、子プロセスでシェル起動しているというこ ですか。 whileの前に exec 0<file.txt を入れないと、最終行が表示されないということですか。 |
>>4480 zsh あー、なるほど。 >>4467 68user > 補足。Solaris の sh では >> while read -r line; do >> done < file.txt > でもダメなようですね のことですね。別件かと勘違いしておりました。 |
>>4481 お >サブシェルで動作するとは、子プロセスでシェル起動しているというこ >ですか。 その通りです。 >whileの前に >exec 0<file.txt >を入れないと、最終行が表示されないということですか。 サブシェル(while)内で use_buf=1 としても、親シェルには引き継がれないので 最後の if 文が必ず偽になります。 よって、最終行(最終行が半角スペースで始まる場合には最終 2 行)が 表示されないと思います。 |
>>4483 zsh 試して見ました。 ファイルの最後が空行(最終行が改行コードで終了)の場合、 whileの前に exec 0<file.txt を入れないくても、最終行が表示されました。 最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、 catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る ファイルをやると、最終行が表示されません。 whileの前に exec 0<file.txt を入れた場合でも。 |
>>4485 お >ファイルの最後が空行(最終行が改行コードで終了)の場合、 >whileの前に >exec 0<file.txt >を入れないくても、最終行が表示されました。 試してみましたが、最終行(空行)は表示されませんでした。 Solaris 標準の sh ですよね? >最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、 >catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る >ファイルをやると、最終行が表示されません。 それは read コマンドが読込めないので、仕方がないというか そこまでやるならシェルスクリプトにこだわらない方が良いかと。 |
GD::Graph で遊んでみました。 http://x68000.q-e-d.net/~68user/webcgi/gd-graph.html http://x68000.q-e-d.net/~68user/webcgi/sample/perl/graph-maker.cgi |
はじめまして。 おじゃまいたします。 早速ですが Opensslライブラリを使用して復号処理を実装したいと考えておりまして RSA鍵交換の場合は、おおまかに分かりましたが DH鍵交換の実装方法がなかなか調べても分からない状況です。 おそらくRSAとは使用するI/Fが異なるのではないかと考えています。 ご存知の方いらっしゃいましたら ご教授頂けないでしょうか。 RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提) (1) pre_master_secretを取得する RSA_private_decrypt()を呼び出す (2) 上記のpre_master_secretとclient_randomとserver_random値より master_secretを生成 (3) データを復号する(master_secretが分かれば復号できる) EVP_Cipher()を呼び出す |
はじめまして。 おじゃまいたします。 早速ですが Opensslライブラリを使用して復号処理を実装したいと考えておりまして RSA鍵交換の場合は、おおまかに分かりましたが DH鍵交換の実装方法がなかなか調べても分からない状況です。 おそらくRSAとは使用するI/Fが異なるのではないかと考えています。 ご存知の方いらっしゃいましたら ご教授頂けないでしょうか。 RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提) (1) pre_master_secretを取得する RSA_private_decrypt()を呼び出す (2) 上記のpre_master_secretとclient_randomとserver_random値より master_secretを生成 (3) データを復号する(master_secretが分かれば復号できる) EVP_Cipher()を呼び出す |
>>4488 take >>4489 take 2度書きしてしまいました。 申し訳ありません。 |
>>4489 take > DH鍵交換の実装方法がなかなか調べても分からない状況です。 わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか? http://www.openssl.org/docs/crypto/dh.html http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html |
>>4491 68user >わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか? > http://www.openssl.org/docs/crypto/dh.html > http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html お返事ありがとうございます。 DH法用の関数はこれなんですね。 お教え頂いた情報を参考に、更に調べてまいります。 |
シェルスクリプトで、 ファイルからフィールド1を読み込み、前後にシングルクォーテーション「'」を 付けて、区切りの1行にしたいのですが、「'」を上手く付けることができません。 「'」の使い方が不正とかで怒られます。 #!/bin/csh nawk -F"," ' { \ if (FNR==1) printf("\'%s\'", $1); \ else printf(",\'%s\'", $1) \ }' file.txt 一度、ダブルクォーテーション「"」にしてからsedで置換しよとしたのですが、 sedでも「'」の使い方が不正とかで怒られます。 nawk -F"," ' { \\ if (FNR==1) printf("\"%s\"", $1); \\ else printf(",\"%s\"", $1) \\ }' file.txt | sed 's/"/\'/g' または、 set a = `nawk -F"," ' { \\ if (FNR==1) printf("\"%s\"", $1); \\ else printf(",\"%s\"", $1) \\ }' file.txt` echo $a | sed 's/"/\'/g' どのようにすればよいのですか。 OSは、Solairs8 |
>>4493 お 参照するファイルについて書いていませんでした。 # cat file.txt Tokyo, Oosaka, Nagoya, Kyoto, Kyusyu, |
>>4493 お csh は馬鹿なので、シングルクォートの中にシングルクォートを書くことはできません。 つまり、 echo '\'' はエラーです (sh も同様)。同様に echo "\"" もエラーになります (sh ならこっちは OK)。 で、csh には (sh も) echo "文字列1""文字列2""文字列3" echo "文字列1"文字列2"文字列3" echo '文字列1''文字列2''文字列3' echo '文字列1'文字列2'文字列3' のいずれも、 echo "文字列1文字列2文字列3" と (基本的には) 同じ、という性質があります。 よって、csh で 'abcdef' を出力したい場合は、 echo "'"abcdef"'" echo "'""abcdef""'" などとします。 シェルのクォートは「ネストさせない」が鉄則です。 |
>> 4495 無理なのですか。 一度、ファイルから取得したものループでechoコマンドを 使いながら編集するということですね。 #!/bin/csh set ALL="Tokyo Oosaka Nagoya Kyoto" @ i = 1 foreach EACH ($ALL) if ($i == 1) then set ALLS=`echo "'"$EACH"'"` else set ALLS=`echo $ALLS",'"$EACH"'"` endif @ i++ end echo $ALLS |
>>4496 お 確認していませんが、awk のプログラム部分を別ファイルにして -f オプションで指定しても出来ると思います。 (この場合はシングルクォートのエスケープは不要です。) |
>>4496 お > 無理なのですか。 いいえ。 awk -F"," '{if (FNR==1){printf "'"'"'%s'"'"'",$1}else{printf ",'"'"'%s'"'"'",$1}}'<file.txt |
>>4497 zsh >>4498 68user zshさん、68userさん ありがとうございます。 出来ました。 「'」を「"」で囲って連続して付けることは試してはいたのですが、 私が試していたのとは違っていました。 それよりも、「'%s'」とするのには気が付きませんでした。 常に「"%s"」としていました。 ただ、 awkで行うと、 ,'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu' と1行目に読み込んだものにもカンマ「,」がついてしまします。 nawkで行うと 'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu' となります。 何が違いとかあるのでしょうか。 |
>>4499 お Solaris の awk では FNR という変数はありません。 NR に変更すれば動作すると思います。 (NR と FNR では、複数ファイルを入力とした時に値が異なります。) |