• ベストアンサー

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