1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ] シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。
513 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:33:03 ] >>512 なぜにワンライナーにこだわるん?
514 名前:512 mailto:sage [2007/01/16(火) 19:44:23 ] スレ違いだけど一応 >>513 簡単に言えば頭の悪い素人だから。 マニュアルになりそうなもんは見たりするんだけど、大体そういうのって一行で処理終わらせるのが多くて。 専門用語がてんでダメだし、 何故処理できるのか?を理解してなくて、「こうやればこういうのができる」でしか認識してなく 自分自身、誰かが書いたソースの簡単な処理や変数を弄るだけしかできないって分かってる。 複数行に渡ると検索でHITしにくいし、「できる」て事さえ分かれば後は調べたらなんとかなるかな、と スレ読んでたら組み合わせ次第でなんとかできそうだわ
515 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 19:55:53 ] カラム数が固定ならpasteとawkをパイプで繋ぐのが楽かな。
516 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 00:33:49 ] 一応、書いてみたんだがな…、1行ぢゃないから駄目か #!/usr/bin/gawk -f BEGIN{ while( (getline line1 < "hoge1.dat" ) > 0 && \ (getline line2 < "hoge2.dat" ) > 0 ){ split(line1,col1) split(line2,col2) print col1[1],col1[3],col2[5],col2[2] } }
517 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 01:45:36 ] >>510 bash 限定かも $ paste <( awk '{print $1,$3}' hoge1.dat ) <( awk '{print $5,$2}' hoge2.dat )
518 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 10:59:01 ] 対話式のスクリプトを作っており、read で入力されたIPアドレスを 正規表現でIPアドレス規則が正しいかを判断さえたいのですが、 どうしたらいいですかね。
519 名前:デフォルトの名無しさん [2007/01/24(水) 11:51:57 ] 関数やサブシェルについての質問です。 まずサブルーチンの方ですが、以下のようにしました。 「Name_sub.sh」 #!/bin/sh echo "What is your name and age ?" read your_name your_age CHECK_NAME () { echo $1 $2 } CHECK_NAME $your_name $your_age これ単体で実行すると、正常に$your_name $your_ageが戻ってくることを確認しました。 これを他のmainスクリプトから呼び出して使おうとしました。 「Name_main.sh」 #!/bin/sh var=(`./Name_sub.sh`) echo '${var[@]} = ' ${var[@]} ここで、Name_sub.shの戻り値を配列varに入れようとすると、 Name_sub.shの対話部分が表示されませんでした。 対話部分をプロンプトに表示して、関数のCHECK_NAMEの戻り値のみ 配列varに代入するにはどうすればよいのでしょうか?
520 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 12:29:27 ] とりあえずtmp.txtファイルに値を保存して、その値をmainで読み込むことにしました。
521 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 13:17:20 ] source を使うケースじゃないのかな。
522 名前:デフォルトの名無しさん [2007/01/25(木) 15:51:10 ] >>518 sh や bash の場合 (ksh もこうだったかも知れない) IFS=. とすると set で指定した変数は '.' で区切られて $n に入るようになる。 たとえば ipaddr に 172.24.1.2 と入っているときに IFS=. set $ipaddr とやると $1 に 172, $2 に 24, $3 に 1, $4 に 2 が入り、更に $# が 4になる(4つに分割されたということ)。 なのでまずはこの直後に if [ $# -ne 4 ]; then echo Error ; exit 1 ; fi のようなことをして4つでなければエラー扱いにしてしまえば良いと思う。 更に $1 から $4 に入っているので for でループさせることもできる。 なのでここで数値が 0 〜 255 になっていなければエラーにすれば良い。 # n に 172, 24, 1, 2 の順で代入されてループする。 for n do if [ 0 -gt "$n" -o 255 -lt "$n" ]; then echo Error ; exit 1 ; fi done テストで数を先に書いている理由は n には何が入ってくるか分からないから。 ('-' で始まるオプションのようなものを入れられてしまうとテストコマンドの 動作が変わってしまうかも知れないため)
523 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 16:05:50 ] どうしても正規表現を使わないと我慢ならんという場合はこんな感じかな。 なんか無理があるが。 if perl -e '$_='\'"$ipaddr"\'';if(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){if($1>=0&&$1<=255&&$2>=0&&$2<=255&&$3>=0&&$3<=255&&$4>=0&&$4<=255){exit 0}}exit 1;' then echo ok else echo ng fi
524 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 17:38:15 ] 正規表現の時は >=0 の判定はいらんと思う。 どちらにしろ面倒だけど。
525 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 22:03:14 ] あ、そうだね。いらないね。
526 名前:デフォルトの名無しさん [2007/02/07(水) 22:53:33 ] [質問] シェルスクリプト初心者です. power 12.34 dBm power 13.45 dBm power 14.56 dBm ある,power(電力) の変化を確認するのに while true; do sleep 1 echo `command`; done で 表示しているのですが 改行して新たな出力を出さないで, 前の出力を消し power 値 dBm の値のところだけが変わる ようにしたいのですが,いい方法ありませんか? clear は使わずにお願いします. 分かりにくい説明ですみませんがどうかよろしくお願いします.
527 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:09:16 ] >>526 キャリッジリターンを使うと吉。 command が複数行出力しているとこれでは上手くいかないけど。 while true; do sleep 1; echo -en "`command`\r" ; done 詳細は man printf かな?
528 名前:デフォルトの名無しさん [2007/02/11(日) 11:20:30 ] シェルスクリプトって例外処理できます? 例えば一つ上の行でエラーが発生したときはそのシェルスクリプトの処理を終了するとか。
529 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 12:14:42 ] >>528 プロセスの終了ステータスを見て条件分岐することはできる。
530 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 13:13:06 ] >>528 普通は>>529 の終了ステータスを使う。エラー時に終了するだけならこれで十分。 シグナルが飛ぶならtrapでシグナルハンドラを書くのもあり。 try/catch/throwに直接対応するものは、Bourne shell、csh、bashにはない。
531 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 20:02:45 ] set -eしとけば、(検査されていない)終了ステータスが0以外の場合は スクリプトが終了する。終了処理はtrap "..." 0
532 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:56:55 ] どもですm(_ _)m
533 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:47:34 ] リダイレクトのことで質問なんですが echo hoge > test ls -l < test とやるとlsは標準入力(つまりtest)の内容を読み込むのなら 普通にls -lとした場合はキーボードからの入力を読み込もうとすると思うんですが、 そうはならないのは何故なんでしょうか?
534 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:19:42 ] >>533 入力がリダイレクトされても、lsは何も読むわけではない。 つまり、ls -l < test と書いても ls -l と書いても同じ事。
535 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:42:01 ] たしかにls -l < testとやっても変わらないみたいです。 今、入門UNIXシェルプログラミングという本で勉強しているのですが、 その本の89ページには echo abc nnn > xyz ls -l < xyz とするとls -l abc nnnとしたときと同じ結果になる。書いてあったのですが、 この本が書かれた時と今ではlsの動作が異なるということなんでしょうか?
536 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:55:46 ] いつの時代か知らんが、lsが標準入力から引数を貰うような作りになってる という話は聞いたことがないな。 ls -l `cat xyz`とか xargs ls -l < xyz ならありえる。 xargsは、はしょって言うと、標準入力から受け取ったものを、自分に与えられ た引数につなげたて、その全体を実行するコマンド。、
537 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:01:14 ] うーんサンプルコードを見ても特にxargsを使っているわけではないようです。 本のタイトル名で検索したらサポートページがあったので、後で この件に関してメールを送ってみようかと思います。ありがとうございました。
538 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:12:21 ] >>537 物はこれか? ttp://shop.sbcr.jp/isbn/shell/index.htm ここには載っていないようだな。 ttp://shop.sbcr.jp/isbn/shell/errata.htm
539 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:17:38 ] この本か。 会社に置きっぱなしだから明日確認してみる。
540 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:22:57 ] 著者名のつづりのミスもみつけられんとこ信用するな
541 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 01:49:29 ] >>535 ls -l `< xyz` なら期待通りの結果になるよ。 bash 依存の記法だったと記憶しているけど。
542 名前:539 mailto:sage [2007/04/05(木) 10:21:44 ] 入門UNIXシェルプログラミング(ソフトバンク株式会社、Bruce Blinn、初版) の87ページに確かに載っているな ---------- $ cat xyz # xyzファイルの中身を確認 abc nnn $ ls -l < xyz # xyzファイルを「標準入力」としてリダイレクトする ---------- ls (GNU coreutils) 5.97では動きませんでしたがええ。
543 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:53:34 ] リダイレクトのことで質問なんですが 中身がスペース一つのファイルsampleを cat test | sed -e 's/ / /' > test2 とするとtest2にスペース10個が出力されるので cat test | sed -e 's/ / /' > test とするとtestの中にはスペースが10個入っていると思うんですが、 中身を見てみると空になってしまいます。 一つのコマンドの中で同じファイルに対して入出力のリダイレクトを行うと 空になってしまうのはわかるんですが、今回の場合はどうしてうまくいかないのでしょうか?
544 名前:543 mailto:sage [2007/04/05(木) 12:55:16 ] すいません、上の例でのtestはsampleの間違いですorz
545 名前:543 mailto:sage [2007/04/05(木) 12:57:52 ] 何度もすいませんorz どうやら連続した半角スペースは一つにまとめられてしまうみたいで、 上の例のs/ / /はs/スペース1個/スペース10個/ってことです。
546 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:50:57 ] >>545 一部のOSのようにパイプラインを非同期にしか実装してない環境ならいざ知らず、 まともなOSではパイプラインの前後のプロセスは同時に実行されるので、 パイプラインに接続する一つのファイルを読み書きしようとすれば当然そうなる。
547 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 14:50:40 ] つまり上の例だと ・最初に書き込み用にファイルを開く、当然ファイルの中身は空になる。 ・catは空のファイルの中身を出力する ・空がsedに渡されるので当然空をファイルに書き込む という順番で処理が行われるんでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:14:56 ] ちょっと違うな。 cat test | sed -e 's/ / /' > test の場合、 シェルがtestを"w"で開いてからcatとsedを起動する筈だから、 catが起動された時点でtestは既に空の筈だ。 空の入力に対してcatは何も出力しないし、sedも同じように何も出力しない。 従って、空になるのはcatやsedが起動される前と言うことだ。 ちなみに、どうしても同じファイルに読み書きしたいなら sed -e 's/ / /' < test | tee test のようにしてしまえばいい。 これなら、シェルがtestを開いてからteeがtestを開こうとするので (unixの開きっ放しのファイルは削除できたように見えてもそれは見掛けだけ仕様に基づき) 無事に処理される筈だ。
549 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:27:54 ] まず最優先でリダイレクトのための処理が行われて、それから コマンドの処理が行われるんですね。わかりました。ありがとうございます。
550 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:02:21 ] なんか今一判っていない悪寒。
551 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 02:40:06 ] >>549 GNU sed 使ってるなら -i オプションつけとけ
552 名前:デフォルトの名無しさん [2007/04/07(土) 19:35:57 ] シェルを初めて組みます。 Cシェルで、自分のグローバルIPを取得して、そのIPをメールで送信するようなプログラムを 組みたいと思っております。 で、グローバルIPの取得の仕方が分からないのですが、 どのようにかけばよいのでしょうか? OSはRedHat10です。
553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:07:14 ] シェルスクリプトのことをシェルゆーな。 Cシェルで書くな。 プライベートアドレス 10.x.x.x 172. {16-32} .x.x 192.168.x.x 割り当てられているIPアドレスは LANG=C /sbin/ifconfig |sed -n 's/inet addr:¥([^ ][^ ]*¥) .*/¥1/p' で取れるから、あとはawkでも使って該当しないものを除外すれば いいんじゃないか? と書いてから気づいたが、家のダイアルアップルータに繋がっている LinuxからグローバルIPアドレスを取ろうとするなら、Linuxにはプライ ベートIPアドレスしか割り当てられてない。取るべきはルータに付いてる グローバルIPアドレスになるから別の方法が必要だぞ。
554 名前:デフォルトの名無しさん [2007/04/07(土) 22:25:30 ] >>553 すいません、ありがとうございます。 何もわかってないんで^^; ずばり、そのとおりで、取得したいのはルータについてるグローバルIPです。。
555 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:42:16 ] >>554 ダイアルアップルータやモデムにはtelnetサーバが内蔵されていることがある。 叩くコマンドが分かれば、expectを使って取得できるかもしれない。 httpサーバを内蔵していることもあるが、こっちはずばりIPアドレスを確認する ページを持ってるかもね。
556 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:00:35 ] >>554 誰もおまいのルータの仕様を知っているやつはいないからな・・・ うちのFLASHWAVE 2040 M1ならID:PASS@ ルータのIP/doKeeping.htmlを wgetで取得してvar sIpAddress="*.*.*.*";の場所を取得すればわかる。
557 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:37:43 ] 何も考えずにメール出せば、大抵はReceived:にIPアドレスが自動的に書かれる。 書かれないならば、書いてくれるメールサーバを提供しているISPに乗り換える。
558 名前:537 mailto:sage [2007/04/11(水) 10:24:46 ] ソフトバンクさんからメールの返事が届きました。 正誤表も更新したみたいです。
559 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:36:15 ] alias定義で改行の前に入れる\にはどのような作用があるのでしょうか? csh でいろいろと試してみたところ、下のようにwhile文などが使えるようになりますが、 一方で、引数を扱ったりwhile文のネストをしたりすると正常に動作しなくなってしまいます。 alias loop '\ set count = 1\ while ( $count <= 5 )\ echo hoge\ @ count++\ end\ '
560 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:45:23 ] 未だだね。
561 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:46:29 ] あーいけね、>560は>558の話ね。 >>559 行末のバックスラッシュは改行文字をエスケープする。
562 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 13:19:26 ] >>561 「改行文字をエスケープする」の意味を具体的に教えて欲しいのです。 >>559 のコードで\+改行を空白に置き換えると動かなくなります。 妙な副作用がなぜ出るのかも謎です。
563 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:34:26 ] >>552 診断君とかにアクセスしてIP抜いてもらって それをパースするのはだめなんか?
564 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:36:33 ] ワンクリ詐欺サイトにアクセスすればIPアドレス教えてくれそうだな。
565 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:29:53 ] >>563 頻度にもよるけどあんま他人様のとこに頼るのもいかんと思う。 自前で取れるんならそうした方が優しいし確実。一応 ttp://info.ddo.jp/remote_addr.php とか使うとワンライナーでやれるけど。
566 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:59:30 ] >>562 シェルスクリプトにおける改行の意味を調べてみると良いよ。 alias loop 'set count = 1;while ( $count <= 5 );echo hoge;@ count++;end;'
567 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 05:02:58 ] >>566 while?
568 名前:デフォルトの名無しさん [2007/04/13(金) 21:22:17 ] 質問させてください。 以下のように、test-serverへ接続し、 date;hostname;whoamiを実行するスクリプトを書いてます。 date;hostname;whoamiの結果をリダイレクトし、 スクリプト本体があるサーバに保存したいのですが、 その場合、どう記述すれば良いでしょうか。 #/bin/bash HOST=test-server UNAME=root PASSWD=*** expect -c " set timeout 20 spawn telnet $HOST expect login:\ ; send \"$UNAME\r\" expect sword:\ ; send \"$PASSWD\r\" expect \"$\" ; send \"ls\r\" expect \"$\" ; send \"date;hostname;whoami\r\" expect \"$\" ; send \"exit\r\"
569 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 11:40:37 ] そのスクリプトの出力をリダイレクトすればいいのではなくて?
570 名前:568 mailto:sage [2007/04/17(火) 21:48:16 ] その方法が分からないのです。expect内部でリダイレクトすると 接続先にファイルが出来てしまうんじゃ無いでしょうか
571 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:45:47 ] >>570 にほんごよめますか?
572 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:08:52 ] ラッパー側のスクリプトの出力をリダイレクトしようとしても、 expectの中で起動したプロセスの出力はexpectが全部食っちゃうん じゃないの?
573 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:39:33 ] あるプログラムをバックグラウンド実行して、 そのプログラムが一定時間後に終了していなかったら終了させる、みたいなことはできますか? こんなイメージです。 #!/bin/sh /bin/hoge & # 数十分かかる。途中で固まるかもしれない。 sleep 3600 # 念のため一時間待ってみる [ hoge が終了していなかったら hogeをkillする。終了していたら無視 ] exit
574 名前:デフォルトの名無しさん mailto:age [2007/04/21(土) 18:41:17 ] あげ
575 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:50:35 ] >>573 こういう事? #!/bin/sh -x DURATION=3600 hoge & PID=$! echo ${PID} sleep ${DURATION} kill ${PID} exit
576 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:51:49 ] >>573 pid控えておいて、atコマンドで終了スクリプトを仕込むとか。
577 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:30:31 ] 一時間の間にpidが再利用されない保証があるなら。
578 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:44:35 ] kill する前に親プロセスの PID を確認すれば。
579 名前:デフォルトの名無しさん [2007/04/21(土) 20:11:19 ] データを 1バイトだけ 読み込むコマンドってなんだっけ?
580 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:21:18 ] >>579 head -c 1 ?
581 名前:573 mailto:age [2007/04/21(土) 22:39:07 ] >>575 こういうことです!ありがとうございます。 >>576 atd動いていないッス。。。 >>577 >>578 pidが再利用されない補償はもちろん無いです。 ググっていますがPPIDを確認をするコマンドが見あたらないorz $!や$$でPIDが取れるようなのでpsコマンドの結果から何とかしてみます。
582 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:22:43 ] waitか何かで子プロセスの終了待てなかったっけ?
583 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:14:45 ] >>573 pid=$! count=0 while [ $count -lt 60 ]; do sleep 60 kill -0 $pid || break count=`expr $count + 1` done [ $count -lt 60 ] || kill $pid
584 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:15:16 ] 待つよ。
585 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:16:01 ] むぅ、30秒差で… >>582 waitで待つよ。
586 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 11:19:01 ] >>583 kill -0 $pid ってどういう意味?
587 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:32:55 ] kill -0 $pid 2>/dev/null || break の方がベターだな。 >>586 man 2 kill The kill() system call sends the signal given by sig to pid, a process or a group of processes. The sig argument may be one of the signals speci- fied in sigaction(2) or it may be 0, in which case error checking is per- formed but no signal is actually sent. This can be used to check the validity of pid. プロセスが存在してそのプロセスにシグナルを送る権限があれば正常終了。 それ以外はエラー。つまり、プロセスの生存確認に使用できる。
588 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:58:56 ] >>587 なるほど。 日本語man読んでも意味がわかんなかったんだ ありがとう
589 名前:デフォルトの名無しさん [2007/04/27(金) 13:30:22 ] シェルブリッド
590 名前:デフォルトの名無しさん [2007/04/28(土) 16:07:15 ] ♪ア・ソ〜レ ア・チョン! ア・チョン! ア・チョン! チョン! チョン! バカ!
591 名前:デフォルトの名無しさん [2007/05/04(金) 00:27:06 ] a.txt 2 4 23 87 483 3 b.txt 89 34 111 8 3 97 とある場合 program a.txt b.txt と打てば 以下のようにに表示されるシェルスクリプトってできませぬか? 2+89=91 4+34=38 23+111=134 87+8=95 483+3=486 3+97=100
592 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:35:51 ] >>591 スクリプトにするまでもないが、 #!/bin/sh paste a.txt b.txt | awk '{ print $1 "+" $2 "=" $1 + $2}'
593 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:36:40 ] あああ、paste $* | awk 以下略
594 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 22:00:14 ] ああpasteって知らなんだサンキュー
595 名前:デフォルトの名無しさん [2007/05/10(木) 19:24:42 ] 自演さらしあげ
596 名前:デフォルトの名無しさん [2007/06/18(月) 22:07:54 ] 既存ファイルの一部のみ書き換える事ってできますか? (ファイル名変えずに) NHK,1 NTV,4 TBS,6 FTV,8 ANB,10 というテキストがあったとして sed 's/N/X/g' という操作をして XHK,1 XTV,4 TBS,6 FTV,8 AXB,10 としたいです。
597 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:23:39 ] 別のファイルに出力した後で、mvかcp
598 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:34:19 ] -i オプションあるならそれ使え
599 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:36:31 ] (mv file file.bak&& sed -e 's/N/X/g' >file) <file
600 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:47:14 ] sed -i 's/N/X/g' file
601 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:04:16 ] sed -i ってどんな機能??
602 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:23:41 ] 手元のsedにはないオプションだ。
603 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:47:04 ] なら perl 使っとけ。 perl -i -pe 's/N/X/g' file
604 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:36:49 ] edでいいんじゃね?
605 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:30:13 ] ファイルのある文字列を含む行と行の間を取得するにはどうしたらいいのでしょうか? 例えば「abc」「def」を含む行の間、2・3・4行目を取得をしたいです。 grepでやろうとしたのですが、どうしてもうまくいきません。。 abcaa aaaaa bbbbb ccccc defbb
606 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:36:36 ] >>605 sed -n '/abc/,/def/p' < text | sed '1d;$d' なんか冗長なのと、該当箇所が複数あると駄目だな。
607 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:37:59 ] パイプの後段を sed '/abc/d;/def/d' にすれば該当箇所が複数あってもOKかも。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:47:05 ] >>605 sed -n '1,/abc/b; /def/q; p'
609 名前:605 mailto:sage [2007/06/27(水) 01:12:46 ] レスありがとうございます。 無理やりawkで冗長なものを作ろうとしてました。 もっと修行して出直します。
610 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:37:53 ] >>609 別にawkでいいんじゃね。ラクだし ↓複数箇所でも大丈夫 awk '/aaa/{f=1;next} /bbb/{f=0} f{print}'
611 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 23:03:01 ] つーかやり無理一行で作らんでも、perlとかで普通に作ればいいんじゃね。 冗長だろうがなんだろうが。
612 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:04:28 ] awkでがんばって一行で作ったのの速度と perlでシコシコださく書いたのの速度は どっちが速いですかね
613 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:11:24 ] 別に全然頑張ってない