• ベストアンサー

shellscriptのコマンドの意味

コマンドの意味を教えてください。 人の作ったshellscriptが動かなくて、デバッグを余儀なくされました。 しかし、UNIXがわかっていないものですから、宜しくお願い致します。 (1) line=`head -$i $filename | tail -1` (2) echo $line >> temp98; sed -e 's#.1..#ABC#g' temp98 >> temp99 $lineには、数字が入っています。例えば、7102 宜しくお願いいたいます

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

  • ベストアンサー
noname#243622
noname#243622
回答No.1

バッククォートで囲んだ箇所 `....` は、中に入っているコマンドを実行して、 その結果をコマンドラインや変数に入れるものです。 files=`ls -1` (※ 数字の1です) とすると、"ls -1" を実行した結果が、変数 files に入ります。 (1) line=`head -$i $filename | tail -1` head -N $filename → $filename の先頭 N 行を表示 tail -1 → 末尾1行を表示 すなわち、$filename の N 行目だけを表示して、変数 line に入れたいのでしょう。 (2) echo $line >> temp98; sed -e 's#.1..#ABC#g' temp98 >> temp99 読む限りですと、$lineの2桁目が数字の1であれば、 temp99というファイルに ABC という内容が追記されるとおもいます。 ただこの操作で実際に何をしたいのかは具体的にわかりません。

noname#95859
質問者

補足

mazingaさん、ありがとうございます。 随分進みました。 sed -e 's#.1..#ABC#g' temp98 >> temp99 における#は、単なる区切り記号で sed -e 's/.1../ABC/g' temp98 >> temp99 と同じなんですね。 ただ、ひとつ、バグの原因がここにありました。 7010でも7100でも反応していました。 7010の時には、temp99に"7ABC"が、7100の時には、期待通りにtemp99に"ABC"が入りました。そこで、 sed -e 's#^.1..#ABC#g' temp98 >> temp99 とすることで、正しく動くようになりました。 ただし、なぜ、"^"が無いと、うまく動かないのかは、理解していません。もし、分かれば、説明していただけませんか? 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#243622
noname#243622
回答No.2

> sed -e 's#.1..#ABC#g' temp98 >> temp99 この書き方ですと、1という数字があって、1行が4文字以上あればパターンマッチしてしまいます。 ですから、 >7010でも7100でも反応していました。 >7010の時には、temp99に"7ABC"が、7100の時には、期待通りにtemp99に"ABC"が入りました。 "7010" の場合は、"7ABC" とはならずに、"7010x" が "7ABC" となっていると思います。("x"は任意の文字列) >そこで、sed -e 's#^.1..#ABC#g' temp98 >> temp99 "^" は先頭という意味です。ですから、先頭から2桁目が数字の1だったらという意味になります。

noname#95859
質問者

お礼

連絡が遅くなりました。 本件、解決しました。ありがとうございました。 今後とも、宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Cシェルにあるコマンドの代わり

    UNIX端末でCシェルのプログラムがあるのですが、今後UNIX端末を 廃棄して、WindowsのPCだけにするようなので、プログラムが使えなくなるのが困ります。 いくつかはVB2005でdosコマンドを使って作り直したのですが、今作ろうとしている物の中の コマンドで調べても解らないのがありました。 echo(echo $a > sssやecho 'abc def' >> sss) cat(set x = 'cat rrr') paste(paste fff ggg > hhh) などのコマンドと、あとawkがありました。 よろしくお願いします。

  • sedコマンド 先頭に空白文字を含む行の挿入

    よろしくお願いします。 [やりたい事] linaxサーバで、行の先頭に空白を3個含む文字列aaaを、/tmp/abc.cnfの3行目に挿入したいですが下記[実施コマンド]ではうまくいかず、上手くいくコマンドラインを教えて下さい。 [実施コマンド] sed -e ”3i <space><space><space>aaa” /tmp/abc.cnf [/tmp/abc.cnf]の中身 △△△123 △△△456 △△△aaa ←コマンドで挿入したい △△△666 △△△777 よろしくお願いします

  • 文字列置換

    UNIXのコマンドで文字列の置換を試みています。 今回行いたい置換としては。。。 12年 1986年2月12日 14 などの文字列を NUM年 NUM年NUM月NUM日 NUM などに、連続した数字をひとまとめにNUMに置換したいと考えています。 文字列の置換方法としてsedコマンドがあると聞いてしらべてみたのですが、いまいいち理解することができませんでした。 自分で考えて試してみたコマンドが以下の通りです。 sed -e "s/\([1-9]\{1,2,3,4\}\)/NUM/g" filename が・・・まったく置換はされませんでした。 よろしければお教えください。よろしくお願いいたします。

  • sedコマンド置換について(マッチした数字を演算に再利用したい)

    こんにちは Linuxのsedコマンドについて質問させてください。 軽く検索をかけたりUNIXのコマンド本を調べましたが、わかりませんでした。 例えば正規表現でマッチした数字を2倍して返す処理をする場合 perlではhogeという文字列に対して  hoge=~s/(\d+)/$1*2/g; このような処理で実現できると思います。 このように今マッチしたものに対して何か処理を行って置換するということは sedコマンド、もしくはそれを使ったシェルスクリプトで処理することは可能でしょうか? sedの方が処理速度が速いので、こちらを使いたいのです。

  • コマンド履歴が~/.bash_historyに保存されない

    通常、コマンド履歴は~/.bash_historyに保存されるはずだと思っていましたが保存されていないようです、原因がわかりません。 助けて頂けませんでしょうか [root@localhost sub]# su - hoge [hoge@localhost ~]$ ls Desktop i a testdir ec.txt [hoge@localhost ~]$ tail ~/.bash_history set|grep abc abc=`date` set|grep abc echo $abc abc=1 echo $abc abc=$(date) echo $abc alias exit

  • vbsより実施のdosコマンド(xcopy)について教えてください。

    何方かご教授頂けませんでしょうか。 1.E:→C:へ特定のDir/Fileコピーを作成したい。 2.特定のDir/Fileは、入力リストにFilePathが行単位で記述される。 3.C:にはE:と同様なDirが存在するものもある。 4.VBSは入力リストを行単位で読み込み、BATファイルへpathを渡す。 5.コマンド発行→コマンドより戻り値→VBS→コマンド発行→・・・  と出来ればさせたいです。(この部分どうしてよいものか?) VBS--- Set objFso = CreateObject("Scripting.FileSystemObject") Set objWsh = WScript.CreateObject("WScript.Shell") inFL = objFso.GetAbsolutepathname("pathlist.txt") inBAT = objFso.GetAbsolutepathname("xcopy.bat") Set objin = objFso.OpenTextFile(inFL,1) Do While objin.AtEndOfStream <> True inline = objin.readLine inpath = "E:"&inline outpath= "C:"&inline objWsh.Run(inBAT&" "&inpath&" "&outpath) Loop bat--- echo F|xcopy /Y %1 %2 pathlist--- \temp\temp1\a.xls \temp\temp1\b.xls ~ 上記、VBSを実行させた結果は --- C:\temp>echo F | xcopy /Y E:\temp\temp1\a.xls C:\temp\temp1\a.xls C:\temp>echo F | xcopy /Y /Y E:\temp\temp1\a.xls C:\temp>echo F | xcopy /Y /Y /Y   ~ 繰返し --- 現状、DOS窓の中、コマンドが繰り返され止まりません。 何方か、「コマンド発行→コマンドより戻り値→VBS→コマンド発行→・・・」、Dir/Fileのコピーがpathlist行単位に行えるようご教授頂けませんでしょうか。 何分初心者なので、拙い文章、ご容赦願います。

  • バッチファイルの文字列をVBSに渡すには

    バッチファイルからVBSを実行しています。 echo msgbox "123" >> %TEMP%\abc.vbs cscript //NoLogo %TEMP%\abc.vbs >%TEMP%\abc.cmd del %TEMP%\abc.vbs call %TEMP%\abc.cmd del %TEMP%\abc.cmd このバッチを実行すると 123 が表示されます。 "123" の部分を変数として引渡したいのです。 set a=123 echo msgbox &a& >> %TEMP%\abc.vbs このようにして実行すると ’コマンドの構文が誤っています。’ となります。 よろしくお願いします。

  • SED スクリプトファイルを複数のファイルに作用させたい。

    SEDのスクリプトファイル(henkan.sed)を作りました。 このスクリプトを実行させたい対象ファイルが15個あります。(temp01.txt~temp15.txt) > sed -f henkan.sed temp01.txt > kekka01.txt > sed -f henkan.sed temp02.txt > kekka02.txt           ・           ・           ・ > sed -f henkan.sed temp15.txt > kekka15.txt これはあまりにもしんどいです。何かよい方法はあるでしょうか。 また、コマンドラインから一つのスクリプトファイルを複数の対象ファイルに作用させることは可能でしょうか。 よろしくお願いします。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

このQ&Aのポイント
  • 急にクレジットカードが使えなくなった理由について、日にち指定や住所の違いなどの要素が関与している可能性があります。
  • また、クレジットカードの限度額が低く設定されている場合、使えなくなる可能性も考えられます。
  • クレジットカードが急に使えなくなった場合、テレビやカーテンの購入などの急な必要性に対応する方法を探す必要があります。
回答を見る