最近シェルスクリプトの勉強をはじめまして、一度自分で作ってみようと思い
行頭が数字の行を表示するシェルスクリプトを書いてみました。
が、うまく出来ません。
表示させたいファイルは字幕ファイルの始めの10行程度で内容は以下の様になってます
1
00:00:03,600 --> 00:00:07,195
xxxxxxxxxxxxxx
xxxxxxxxxxxxxx
2
00:00:07,360 --> 00:00:09,635
xxxxxxxxxxxxxx
xxxxxxxxxxxxxx
・
・
・
xxxxxxxxxxxxxの部分には英語の台詞が入ります。
以下が自分で作ってみたスクリプトです。
#!/bin/bash
while read Line
do
if [ "$Line" eq [0-9][0-9] ]
then
echo $Line
else
:
fi
done < $1
表示させたいのは行頭が数字の行なので自分の望む結果は
1
2
3
・
・
・
です。
初歩的な間違いかもしれませんが、自分にはどこが間違っているのか分かりません。
酷いスクリプトかもしれませんが、一応完成させてみたいのでご指導お願いしますm(_ _)m
No.4ベストアンサー
- 回答日時:
とりあえず問題点とその理由を書き出しますと。
if の後の [ ] はtestコマンドのエイリアスなのですが、
testコマンドでは、数値としての比較あるいは文字そのものかの比較しかできないので、
ワイルドカードや、正規表現は使えません。
$ hoge=012
$ test $hoge = 012; echo $? ならば返値は0ですが、
$ test $hoge = 0*; echo $? みたいなことはできず返値は1となって不一致となります。
なので、ワイルドカードや正規表現を利用して判断基準を作りたいならば、
case構文を利用するか、あるいはgrepなどを利用する必要があります。
また、仮にtestコマンドでワイルドカードや正規表現が使えたとしても、
[0-9][0-9]では、目的のものには引っかかりません。
正規表現で 1改行 2改行 などをマッチさせたいならば、
$ grep '^[0-9]*$'なんてしないとかかりません。
次に、これは別に間違いではないのですが、
ファイルを<や<<でインプットとかヒアドキュメントすると、
それが最後にかかれるために、複雑になってくると、どれがどこを読んでいるのか分かりにくくなります。
必要ならばファイルは素直にcatの引数として渡したほうが無難でしょう。
以上を踏まえきちんといらないところを省いてやれば、
#!/bin/sh
grep '^[0-9]*$' hoge.txt
と、かけます。
この場合、ifもtestもヒアドキュメントもいらず、コマンド一回ですむスクリプトかどうか疑わしいもので十分なわけです。
回答ありがとうございます
>ファイルを<や<<でインプットとかヒアドキュメントすると、
それが最後にかかれるために、複雑になってくると、どれがどこを読んでいるのか分かりにくくなります。
今後の参考にします
>以上を踏まえきちんといらないところを省いてやれば、
#!/bin/sh
grep '^[0-9]*$' hoge.txt
と、かけます。
この場合、ifもtestもヒアドキュメントもいらず、コマンド一回ですむスクリプトかどうか疑わしいもので十分なわけです。
そうですね、スクリプトにする必要もありませんね(笑)
No.5
- 回答日時:
修正です
> [ (test)コマンドで eq は「文字列が等しい」です。
→ eqなどという演算子は用意されていません。 = で「文字列が等しい」 -eqで「数値(整数)が等しい」です。
パターンマッチでは無いのは同様です。
> grep '^[0-9][0-9]*' $1
→ 数字だけの行なら grep '^[0-9][0-9]*$' $1 でした。
ただ、既に指摘のあるように、「数字だけの行」なのか「数字で始まる行」なのかがはっきりしないので、どちらが正しいかわかりません
No.3
- 回答日時:
ちょっと確認:
「行頭が数字の行」には
00:00:03,600 --> 00:00:07,195
なども含まれるはずなんだけど, 「望む結果」に入っていないのはなぜ?
No.2
- 回答日時:
シェルでプログラムするのも良いですが、この場合は#1のgrepやSED、Perlなどのコマンドを活用するとより簡単に探せます。
SEDは、下記のような1行で終わりです(動作確認していないですが ^ ^;)。
$ SED -e '/^[0-9]/p'
意味
・/^xxx/は、「//」が探すパターンを指定、「/^xxx/」はxxxで始まるパターンという意味
・/[0-9]/は、0、1、2・・・、9を表現する正規表現
SEDの説明
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
SEDは、古くからあるツールですが、ご質問のような作業には最適なツールと思います。
No.1
- 回答日時:
> if [ "$Line" eq [0-9][0-9] ]
ここでエラーになったりしませんか?
・[ (test)コマンドで eq は「文字列が等しい」です。完全一致です。正規表現などのパターンマッチではありません
・[0-9][0-9] こういうものは、まず、ファイル名に展開されます。ls *.txt とかやったときには、「lsが *.txt にマッチするファイルを探す」のではなく、「シェルが*.txtにマッチするファイル名に展開してからlsを実行」します。実際に実行されれうのは、例えば ls a.txt b.txt c.txt とかになります。
この場合、数字2桁のファイル名がなければエラーになるか、そのまま[0-9][0-9]という文字列になります(設定による)
パターンマッチさせたければ、case文を使うとか、grep等のコマンドを使うとかになります。
もっとも、grepを使うなら
grep '^[0-9][0-9]*' $1
の1行で終わりですけど。
あと、while read line みたいなのは最後の手段って思っておいた方がいいですよ。大抵は 各種コマンド(grep,sed..)とパイプで効率よく記述できますから
回答ありがとうございます。
>[ (test)コマンドで eq は「文字列が等しい」です。完全一致です。正規表現などのパターンマッチではありません
なるほど、勉強になります。
>もっとも、grepを使うなら
grep '^[0-9][0-9]*' $1
の1行で終わりですけど
そうします。スクリプトにする必要もありませんでしたね(笑)
>あと、while read line みたいなのは最後の手段って思っておいた方がいいですよ
自分は、それが最高の手段だと思ってました、最後だったのですね(汗)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ubuntu(linux)のシャットダウン...
-
bashでシングルクォート内の変...
-
ログにserver reached MaxReque...
-
Linuxへの移行 来年でWindows10...
-
ubuntuで デイスク/deb/loopと...
-
AWSでSSH接続をしたいのですが...
-
Linux のシェルスクリプトの強...
-
Windowsのローカルディレクトリ...
-
Ububtuでファイル共有できない...
-
shellscript内のコマンドを、su...
-
Linux Mint 日本語入力できなく...
-
WineのRufusでデバイスを検知す...
-
lubuntuでフォントをインストー...
-
ubuntuのシャットダウンが進ま...
-
linuxサーバーのキャッシュをク...
-
Chromebook Linux Extundelete...
-
Ubuntu でinvalid filenameとな...
-
VirtualBox ゲストOSにPC内蔵HD...
-
AppImageがインストールできな...
-
Kali Linuxで起動できない - Mi...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashでシングルクォート内の変...
-
ubuntu(linux)のシャットダウン...
-
至急です。kubuntu24.04ltsをUS...
-
ubuntuで デイスク/deb/loopと...
-
AWSでSSH接続をしたいのですが...
-
ubuntuのシャットダウンが進ま...
-
shellscript内のコマンドを、su...
-
linuxサーバーのキャッシュをク...
-
LinuxMintが突然フリーズする
-
tarで纏める際に、複数場外した...
-
Linux Mint 日本語入力できなく...
-
Ubuntu on Xorgのログインについて
-
ログにserver reached MaxReque...
-
ssl_request_logの必要性について
-
Ubuntuで数字だけのユーザーア...
-
ssl_error_logのエラー内容(AH...
-
Kali Linuxで起動できない - Mi...
-
Windowsのローカルディレクトリ...
-
Postfixでドコモメールに送信す...
-
Rasberry pi のオンボードNICの...
おすすめ情報