トップページunix
1002コメント330KB

シェルスクリプト総合 その25©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2015/08/14(金) 23:42:01.51
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0124名無しさん@お腹いっぱい。2015/10/29(木) 10:15:07.66
スレ違いでも板違いでもかまってもらえるからな
0125名無しさん@お腹いっぱい。2015/10/29(木) 11:15:37.67
>>120
お前脳みそついてなくてUnix使ってんのか?
Windowsでも使ってろよ
希望してることができるから
0126名無しさん@お腹いっぱい。2015/10/29(木) 12:04:46.30
コピペに釣られんな
0127名無しさん@お腹いっぱい。2015/10/29(木) 22:18:02.02
>>123
>>123
0128名無しさん@お腹いっぱい。2015/10/30(金) 11:01:24.94
>>124
軌道修正したレスができるなら相手して構わないんだけど、自演が疑われるような受け売り回答って不要だよな。
0129名無しさん@お腹いっぱい。2015/11/01(日) 13:31:00.57
${@:+"$@"}という変数の記法がわかりません
たとえば/usr/bin/sensible-browserでは
/usr/bin/x-www-browser ${URL:+"$URL"}
のように使われています
なぜこう書くのかヒントをいただけたら…
0130名無しさん@お腹いっぱい。2015/11/01(日) 14:16:24.02
man bash
Parameter Expansion の項(日本語訳では パラメータの展開 の項)
を見るよろし。てか俺がしょっちゅう見直すとこだわソレw
0131名無しさん@お腹いっぱい。2015/11/02(月) 12:13:01.41
ポータビリティーの話( "$@"; が 何も無し にならないで、""; と解釈されてしまう対策の事 )が参考になるかな

What does ${1+"$@"} mean?
http://www.in-ulm.de/~mascheck/various/bourne_args/

Autoconf
http://www.geocities.jp/fut_nis/html/autoconf-ja/Shell-Substitutions.html#Shell%20Substitutions


# 例えば、 $URL が未定義や、ヌルなら
/usr/bin/x-www-browser "$URL"
# は、この様な意味になるが
/usr/bin/x-www-browser ""

/usr/bin/x-www-browser ${URL:+"$URL"}
# は、こうなる
/usr/bin/x-www-browser


test.sh 引数の数に違いが出る(bash の方で理解しやすいので #!/bin/bash で)
#!/bin/bash -vx
foo="hoge"
bar=""
bash -vxc 'echo "$#, " "$@"' "dummy" "$foo"
bash -vxc 'echo "$#, " "$@"' "dummy" "$bar"
bash -vxc 'echo "$#, " "$@"' "dummy" "$baz"
bash -vxc 'echo "$#, " "$@"' "dummy" ${bar:+"$bar"}
bash -vxc 'echo "$#, " "$@"' "dummy" ${baz:+"$baz"}
01321292015/11/02(月) 14:09:15.67
>>130
アドバイスありがとうございます。自分もよくそこ見ます

環境はlinuxのbashなのですが、"$@"と書いておけば
${@:+"$@"}と結果的に同じになるはずなのに
わざわざ後者のように書くのはどうしてかなと疑問に思った次第です
01331292015/11/02(月) 14:12:02.34
>>131
有益な情報ありがとうございます
なるほど"$@"が""になってしまうことがあるためなのですね
違いを確認するためのスクリプトまで用意していただいて感謝です
おかげで長い間疑問だったことが氷解しました

/usr/bin/sensible-browserは、#!/bin/shですし
ポータビリティを十分に考えて作られているわけですね
なぜAdobeのacroreadなどでも使われているか納得できました
とっても勉強になりました
01341312015/11/03(火) 18:32:53.39
>>133
> ポータビリティを十分に考えて作られているわけですね
/usr/bin/sensible-browser は、Debian 系で使われているスクリプトのようなので
dash で動けば十分でしょう
ポータビリティのサイトは参考になるかと貼りましたが、${1+"$@"} と違って
/usr/bin/x-www-browser ${URL:+"$URL"} の場合、関係無いかと思います

念の為 dash 等で内容がヌルの場合に、"$URL" と、 "$@" で展開の結果に違いが有る事を、強調しておきます
LANG=C PAGER='less -p "Special Parameters"' man dash
> @   Expands to the positional ...略... If there
> are no positional parameters, the expansion of @ generates
> zero arguments, even when @ is double-quoted.
0135名無しさん@お腹いっぱい。2015/11/04(水) 10:19:47.91
ADB shellを使ってるのですが.shで保存したadbのスクリプトを順番に実行させることって可能ですか?
例えばダブルクリックした時点で1.shが動いて〜10秒後に2.shを動かして〜というような感じにしたいです。
お力貸していただけると幸いです。
0136名無しさん@お腹いっぱい。2015/11/04(水) 12:50:56.08
ADB shellを実行するのがWindowsかlinuxによってバッチかシェルスクリプトかでわかれるが、
最初に/data/local/tmpあたりに転送して、chmodして、それをwait含めて実機で実行するのが
良いんじゃないの。

何をやりたいのか書いてないのでアレだが、操作する側で10秒開けるのか、実機で10秒ウェイトするのか。
あと、なぜ10秒あける必要があるのか、10秒後までに実行した端末で何が起きているのか、
その判定は必要なのか、などを考える必要があるし、
さらには泥のことをよく理解できてないオッサンたちが、こういう話題は、ここではスレチじゃね?
と煽ってくるので、飛来するオッサンたちを黙らせる技術も必要とされる
0137名無しさん@お腹いっぱい。2015/11/04(水) 13:12:49.86
すみません 記述が足りてないようでした。
現在はwindowsでbatファイルを利用してuwscというフリーソフトを使って1.batを起動させて〜10秒後に2.batといった具合にやってます。
最近linuxでも開発を始めたいと思い同じようなことがしたいです。
シェルスクリプトでwindowsでやってるuwscのような制御ができないかなぁと思って質問させていただきました。
そんなめんどくさいことするよりlinuxならこのフリーソフト使って制御しとけみたいなのがあれば
教えていだだけると幸いです。
0138名無しさん@お腹いっぱい。2015/11/04(水) 13:15:27.82
>uwscというフリーソフトを使って1.batを起動させて〜10秒後に2.batといった具合に

この10秒後に、という処理自体をbatでやればいいんじゃないの?
なぜuwscを挟む必要があるの?
0139名無しさん@お腹いっぱい。2015/11/04(水) 13:29:28.23
>>138 おっしゃる通りなのですがcallを使って次のbatを呼び出すことよりも先にツールを使って呼び出すことを覚えてしまったもので・・・
独学でやってるうえに無知な状態からまだ2ヶ月くらいしか経ってないものでこのスレのレベルの方からしたら程度が低い質問かもしれませんが他に聞けるような環境がないもので;;
0140名無しさん@お腹いっぱい。2015/11/04(水) 13:33:00.98
あとは、何をやりたいのか具体的に書くしか

ちなみにゲームの自動制御とか、その手の話だったら俺は降りる
0141飛来したオバハン2015/11/04(水) 13:33:27.01
アンタ泥とかwindowsとかイタチじゃないの?
0142名無しさん@お腹いっぱい。2015/11/04(水) 17:24:19.98
PATH の dirctory に無いスクリプトは、相対、絶対パスで起動するか、PATH に追加する
例えばカレントディレクトリのスクリプトは、
./script.sh
で起動出来る
ダブルクリックで起動するには、 .desktop ファイル作る

#!/bin/sh
./1.sh
sleep 10
../2.sh

/home/username/bin/3.sh

PATH="/home/username/bin:$PATH"
4.sh

PATH=".:$PATH"
1.sh
0143名無しさん@お腹いっぱい。2015/11/04(水) 17:24:50.70
又は、android 上で launcher.sh を書いておいて起動する
それをアプリから起動するなら、GScript Lite とか使うんや。よー知らんけど

#!/system/bin/sh
./1.sh
sleep 10
./2.sh

ついで

@echo off
call 1.bat
ping localhost -n 11 > nul
call 2.bat
0144名無しさん@お腹いっぱい。2015/11/04(水) 21:13:41.29
みなさんありがとうございました。すこし足がかりが得られました。
やっぱりlinuxのほうが軽くて動作も安定してる感じなのでこれからはlinux中心にデバッグを行っていけたらと思います。
0145名無しさん@お腹いっぱい。2015/11/08(日) 19:54:14.49
echoで\tを出力してるんだけど
raspbianだとTABに置き換わってるんだけど
Sientific Linuxだと\tのままなんだけど何でかわかる?
シェルスクリプトをそのまま持っていって実行したら
そんな感じになってた・・・
0146名無しさん@お腹いっぱい。2015/11/08(日) 20:08:08.87
シェルスクリプトと違って、シェルの話だと思う
echo の違いではない?

man dash
echo [-n] args...
If any of the following sequences of characters is encountered
during output, the sequence is not output. Instead, the specified
action is performed:

man bash
echo [-neE] [arg ...]
-e オプションを指定した場合、以下に示す、バックスラッシュの
エスケープ文字が解釈されるようになります。
0147名無しさん@お腹いっぱい。2015/11/08(日) 20:14:18.70
シェルスクリプトのポータビリティーの話とも言えるか...
訂正
0148名無しさん@お腹いっぱい。2015/11/08(日) 20:37:50.28
ありがとうございます
確か実装したときにecho -eオプションは使っていたのですが
raspbianの/bin/shで実行すると

echo -e "test\ttest"



-e test test

になってしまっていろいろ試した挙句
-eいらないじゃんってことになったのを思い出しました
今は双方とも/bin/shを使っているのですが
上記のようになるのはraspbianの/bin/shだけで
/bin/bashを使うと双方とも期待したとおりの結果になりました

どこかのデストリのいずれかのシェルが
実は利用者が意識してるもの(パスが示すもの)と違うというのを
見た覚えがあるのですがraspbianの/bin/shだったかは思い出せません

継続して調べてみますが取り急ぎありがとうございました
0149名無しさん@お腹いっぱい。2015/11/08(日) 22:14:22.18
echo じゃなくて printf 使うとか

printf 'TAB\tTAB\n'

# 少なくとも dash/bash/zsh では printf は shell の builtin function

そういや、ファイルの中に

-n

だけの行があって、

cat hoge.txt | while IFS= read str
do
echo "$str"
done

ってしたらその行が出力されなくてハマったことがあった…
0150名無しさん@お腹いっぱい。2015/11/09(月) 12:53:41.77
>>149
どうやって回避したの?参考までに知りたい
0151名無しさん@お腹いっぱい。2015/11/09(月) 18:25:32.86
え? 単に printf '%s\n' "$str" ってしただけだよ
0152名無しさん@お腹いっぱい。2015/11/09(月) 22:29:31.56
echoはposixでその動作が決まってるわけじゃないから
移植性重視ならprintf安定
とorilyに書いてあった
0153名無しさん@お腹いっぱい。2015/11/11(水) 18:21:45.18
1週間位試行錯誤するもうまくいかないから、ここで必要質問しようと思ったら
単にファイル名にスペースが入っていただけだった
風俗行って頭をすっきりしてます
0154名無しさん@お腹いっぱい。2015/11/11(水) 19:33:08.21
それは書き込まなくてよかったんじゃないか
0155名無しさん@お腹いっぱい。2015/11/12(木) 14:52:38.27
複数ファイルのダウンロードアルゴリズムについて教えてください

今シェルスクリプトを作ってテキストファイルに書かれてある
URLからファイルをダウンロードしています
早くダウンロードしたいため多重(多重度は回線の帯域などを考慮して3〜15で任意で設定)で
ダウンロードしていますが全体の終了時間を早めたいため
ファイルサイズでソートして大きいファイルからダウンロードしています
ただこの方法だと初めの方に大きいファイルばかりダウンロードするため
成果が上がってるように見えません
またもっと効率のよい方法があるのではとも思っています
お勧めのダウンロード順(を求めるアルゴリズム)があれば教えてください

なおちょっとしたシェルスクリプトは書いていますが
やってることは以下のコマンドと大差はありません

xargs -P 10 -n 1 wget -nv -c < downlist.txt

私のほうで考えられるのはたとえば10多重の場合
大きいものからを5多重で
小さいものからを5多重で
順にダウンロードすることくらいでした
でもこの方法だと全体のダウンロード完了が
遅くなる可能性があると思います
0156名無しさん@お腹いっぱい。2015/11/12(木) 15:11:44.91
なんで大きいファイルから始めると全体の終了時間が早くなるの?
0157名無しさん@お腹いっぱい。2015/11/12(木) 15:27:23.69
ちょっとうまく説明できませんが
大きなファイルは時間がかかるので
複数ファイルを多重でダウンロードしても
最長時間になる可能性があるためです

たとえば100MB、50MB、40MB、30MB、10MBのファイルを2多重でダウンロードするとき
以下のようにすればそれぞれ平均化されるため

1つめ:100MB→10MB
2つめ:50MB→40MB→30MB

なお以下のようになるのは最悪なパターンだと思います。

1つめ:100MB→50MB
2つめ:40MB→30MB→10MB

全体の終了時間が短くなる想定です
また当然ダウンロード速度は一定ではないため
特定のファイルに時間がかかった場合
小さなサイズのファイルだと調整がしやすいというのもあります

1つめ:100MB→30MB→10MB
2つめ:50MB(時間がかかった)→40MB

実際はスクリプト内でpsコマンドで多重度は監視しており
whileでループしながらダウンロードしているため
そのあたりの調整は楽にやれます
0158名無しさん@お腹いっぱい。2015/11/12(木) 15:28:52.53
例えば他のファイル全部の合計より大きなファイルが一つある場合、
この大きなファイルのダウンロードを最初からスタートさせれば
全体ダウンロード時間はこのファイルのダウンロード時間になるけど、
この大きなファイルのダウンロード開始を遅らせると
全体ダウンロード時間もそれだけ長くなることになるってことだよね
0159名無しさん@お腹いっぱい。2015/11/12(木) 15:31:56.60
>>158
そのとおりです
(大きなファイルはクリティカルパスになりえるってことです)
0160名無しさん@お腹いっぱい。2015/11/12(木) 16:43:29.68
>>155
> ただこの方法だと初めの方に大きいファイルばかりダウンロードするため
> 成果が上がってるように見えません

この場合の成果とはより短い時間で完了することであるわけだが
大きいファイルを先に転送すると短い時間で済む筈だったが実際には逆で
より長い時間掛かってしまうから何とかしたい、ということですか?
0161名無しさん@お腹いっぱい。2015/11/12(木) 17:51:07.33
俺の予想では、プログレスバー的なのを表示したいけど、
大きいファイルが先だとはじめはなかなか進まないってことじゃないかな。

どんなコマンドでダウンロードしてるか知らないけど、
たいてい転送バイト数を出力できるはずだから、
頑張って出力を解析して計算すればいいかと。
あるいは手元のファイルサイズを監視したほうが早いか。
0162名無しさん@お腹いっぱい。2015/11/12(木) 17:59:30.65
でも質問はより効率のよダウンロード順(を求めるアルゴリズムだぜ
0163名無しさん@お腹いっぱい。2015/11/12(木) 18:33:07.59
max procが10なら、大きいファイルから10個を多重でwgetする。
その時、残りのファイルのダウンロード順はまだ決めない。
その10個のwgetのうち、どれか先に終了したもの(ファイルサイズ最小のもののことが多いがネット環境によりそうとは限らない)
について、その時点で残りのファイルのうちサイズ最大のものを割り当てて
ダウンロードさせる。
以下、残りファイルがなくなるまで繰り返し。
0164名無しさん@お腹いっぱい。2015/11/12(木) 20:25:10.34
厳密な重さのわからないナップサック問題って感じだな。
ダウンロード時間があらかじめ分かっていたとしてもとても難しい問題。
数学苦手なのでテキトーに聞き流してもらえると助かるが、多分 NP hard って呼ばれる問題と
同等で、全通り試さないと厳密解は得られないんじゃね?

現実的には >>163 の言う貪欲法(greedy algorithm)的な?アルゴリズムが一番だろうな。
0165名無しさん@お腹いっぱい。2015/11/12(木) 22:52:33.75
複数のファイルが全部同じサーバーにあるのかとか、別々だとしても
自分側のバンド使い切っていないかとか、もっと条件詰めないと
そもそも議論出来ない気がするけど。
0166名無しさん@お腹いっぱい。2015/11/13(金) 02:37:34.17
多重ダウンロード禁止
0167名無しさん@お腹いっぱい。2015/11/13(金) 02:48:29.59
分割ダウンロード禁止
0168名無しさん@お腹いっぱい。2015/11/13(金) 12:04:00.88
エロ画像ダウンロード禁止
0169名無しさん@お腹いっぱい。2015/11/13(金) 12:06:28.52
\(^o^)/
0170名無しさん@お腹いっぱい。2015/11/13(金) 23:16:03.31
むしろ、トラフィックを監視して、一定以下になったらwget開始するスクリプトじゃ駄目なの?
0171名無しさん@お腹いっぱい。2015/11/14(土) 00:11:59.24
回線異常で止まった時にさらに追い討ちかけるのか
0172名無しさん@お腹いっぱい。2015/11/14(土) 00:39:23.96
ん、ヒントにならなかったか
ファイルを分割してダウンロードすればいい
0173名無しさん@お腹いっぱい。2015/11/15(日) 12:35:05.13
>>171
異常だったらtcp二階建てとかしてない限りロストしてるんだから
どんどん長くなるタイムアウトをボケっと待ってたって仕方がないじゃん
むしろ定期的に試行するようにしたほうが復旧を即感知できるんじゃないか?
0174名無しさん@お腹いっぱい。2015/11/19(木) 07:18:13.65
ルート所有のテキストファイルに、テキストを追加するために以下のコマンドを
実行するのですが、許可がないとはねられます。パスワードを入力しろ、も出て
きません。
実行者はもちろん、visudoでUSER ALL=(ALL) ALLの権限を与えられています。

$sudo echo "abc" >> /path/a.txt
bash: /path/a.txt: 許可がありません

何が問題なのでしょうか?
0175名無しさん@お腹いっぱい。2015/11/19(木) 07:28:16.93
sudo コマンドが >>/path/a.txt を持って行ってしまうのが問題(だと思う)
sudo sh -c 'echo "abc" >> /path/a.txt'
0176名無しさん@お腹いっぱい。2015/11/19(木) 07:30:35.56
174です。

ぐぐったら答え書いてありました。失礼しました。
最初のechoだけsudoで評価されて、リダイレクトはそうじゃないと。
0177名無しさん@お腹いっぱい。2015/11/19(木) 09:35:05.07
>>175

さんくすです。なるほど。

ググり先を参考に、evalを使いました。
また、引数が複数の場合も含めて、スクリプトにしました。
パイプを使わない分、>>175 さんのほうがスマートですね。

for i in "$@"; do
eval echo $"$i" | sudo tee -a /path/a.txt
done
0178名無しさん@お腹いっぱい。2015/11/19(木) 09:36:39.66
まちがった。

>ググり先を参考に、evalを使いました。

evalじゃなくて、teeだった。すんません
0179名無しさん@お腹いっぱい。2015/11/19(木) 13:15:22.39
ググると、これらはよく見る様になりました
sudo sh -c 'echo "hoge" > "teki tou"'
echo hoge | tee "teki tou" >/dev/null


他の解決方法を考えてみました
# /dev/null 反対
echo hoge | sudo sed -ne w"teki tou"

# tee の様にファイル名を引数で受け取る
echo hoge | sudo sh -c 'cat > "$0"' "teki tou"

# pipe は無しの方向で
sudo sh -c 'echo "hoge" > "$0"' "teki tou"
0180名無しさん@お腹いっぱい。2015/11/19(木) 22:35:50.88
>>179
スレ違い
というかシェルスクリプトにすれば問題ないのに
0181名無しさん@お腹いっぱい。2015/11/20(金) 13:29:04.21
どういう事?
スクリプトで使う要点の一行を書くのは、このスレでなくともよく有る事では?

sudo を使っていてスクリプト向けの行ではないって事かな?
0182名無しさん@お腹いっぱい。2015/11/20(金) 13:42:47.00
>>181
違うよ。
リダイレクトを含めてスクリプトに書いておけば
sudoで(リダイレクトの)問題が起きないという意味。
0183名無しさん@お腹いっぱい。2015/11/20(金) 13:54:47.85
なんでスレ違い?
0184名無しさん@お腹いっぱい。2015/11/20(金) 14:14:40.64
ラベルが低いから。
0185名無しさん@お腹いっぱい。2015/11/20(金) 14:38:57.72
要点を貼るのはいいんだが
スクリプトの意図がよくわからない
0186名無しさん@お腹いっぱい。2015/11/20(金) 19:37:14.93
自演くさっ
0187名無しさん@お腹いっぱい。2015/11/20(金) 22:49:21.30
引数を元に関数の中{と}の中を表示するコマンドありませんか?
test.txt
int main()
{
printf("\n");
}
int hoge()
{
モジモジ
文字文字
}
void pyo()
{
もじもじ
}
--------------
$コマンド test.txt hoge

モジモジ
文字文字
0188名無しさん@お腹いっぱい。2015/11/21(土) 00:03:09.77
無い
0189名無しさん@お腹いっぱい。2015/11/21(土) 00:06:00.44
じゃ、GNU grep で。

#!/bin/sh

grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n?})" "$1"
0190名無しさん@お腹いっぱい。2015/11/21(土) 00:15:34.13
>>187
ありません

というか、何のためにそういうコマンドが必要か書いた方が
的確なアドバイスもらえる可能性高そう
0191名無しさん@お腹いっぱい。2015/11/21(土) 00:18:18.23
>>189
保守性ゼロ、使い回せる可能性ゼロのいい見本だな
0192名無しさん@お腹いっぱい。2015/11/21(土) 00:48:31.94
いいんじゃない、それで
0193名無しさん@お腹いっぱい。2015/11/21(土) 00:52:28.46
>>189
できました、ありがとうございます!

>>190
目的は外部ファイルにある関数を調べたかったのでcatで連結して
一括で調べたかっただけなのです…
0194名無しさん@お腹いっぱい。2015/11/21(土) 01:00:24.01
>>193
え、できたのw ネタのつもりで書いたのにw
まぁ真面目な話、関数内にブロックがあったら途中でちょん切れるので気をつけて。
0195名無しさん@お腹いっぱい。2015/11/21(土) 01:04:07.86
>>193
if文とか無いの?


関数の中に

}

が有れば、そこで切れると思うよ
0196名無しさん@お腹いっぱい。2015/11/21(土) 01:05:28.85
かぶってた
0197名無しさん@お腹いっぱい。2015/11/21(土) 01:12:31.11
きちんとインデントされていて、関数ブロックの終端が必ず
"\n}" である、という条件なら以下で

grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n})" "$1"
0198名無しさん@お腹いっぱい。2015/11/21(土) 01:26:46.64
indent(1) と組み合わせればどうか
0199名無しさん@お腹いっぱい。2015/11/21(土) 02:25:44.08
tag作れよ
0200名無しさん@お腹いっぱい。2015/11/21(土) 17:10:42.13
sedならどうなの?
0201名無しさん@お腹いっぱい。2015/11/21(土) 18:12:48.25
GNU版grep2.5.4で「『条件A』または『条件Bかつ条件C』」という指定をするにはどうすればよいのでしょう

例えば、以下のようなテキストで

111
aaa
222
bbb 〜 ccc 〜
bbb 〜 ddd 〜

「aaa」または「bbbかつccc」だけ抜き出して

aaa
bbb 〜 ccc 〜
を抜き出したいです

grep aaa sample.txt
grep -e bbb -e ccc sample.txt
として、個別の条件で出力できるところまでは分かったのですが、
テキストに出てくる順番も重要なので、何とかうまくできないかと思ってます

それともawkとかを使う必要があるのでしょうか…
0202名無しさん@お腹いっぱい。2015/11/21(土) 18:21:02.93
こんなんでいいんじゃない

grep -E 'aaa|bbb.*ccc|ccc.*bbb' a.txt
0203名無しさん@お腹いっぱい。2015/11/21(土) 18:27:53.77
>>202
できました
「bbb.*ccc」「ccc.*bbb」という書き方が思いつきませんでした

ありがとうございました
0204名無しさん@お腹いっぱい。2015/11/21(土) 18:57:13.66
関数の内部を切り出すような処理は
yacc(よく知らないんだけど)なんかは関係ない?使えないの?
0205名無しさん@お腹いっぱい。2015/11/22(日) 19:30:02.70
ファイルのリネームについてご教授ください
01.mp4
02.mp4

25.mp4
という動画ファイルがあります

それとは別のテキストファイル (List.txt) があり、内容は
orange 01「みかん」
orange 02「ぽんず」

orange 25「かんきつ」

動画ファイルを、テキストファイルから取得した文字列で
リネームしていきたいですが良い方法を知りたいです
sedやawkでも構いません
よろしくお願いします

環境はMac El Capitanです
0206名無しさん@お腹いっぱい。2015/11/22(日) 20:11:25.81
>>205
for i in {01..25}
do
mv $i.mp4 $(grep $i List.txt).mp4
done
0207名無しさん@お腹いっぱい。2015/11/22(日) 20:56:26.91
>>206
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory

というメッセージエラーで上手くいかなかったです
List.txtの空白スペースに対応してなかったようで
orange 01「みかん」→ orange01「みかん」にしておくと
うまくいきました
0208名無しさん@お腹いっぱい。2015/11/22(日) 20:57:02.29
ありがとうございます
0209名無しさん@お腹いっぱい。2015/11/23(月) 10:43:36.03
常にダブルクォートを心がけること
0210名無しさん@お腹いっぱい。2015/11/23(月) 14:52:02.86
>>187>>200
私はsedでこういう使い方なら使用度高いな。
ただCの関数の抜き出しなどはこれだけじゃ全然足りないね。
readf ()
{
sed -n '/[[:space:]]*[int|void][[:space:]]\+'$1'[[:space:]]*(.*)/b filter1; d;
:filter1; n; /[[:space:]]*{/n; :filter2; /[[:space:]]*}/q; p; n; b filter2' $2
}
0211名無しさん@お腹いっぱい。2015/11/23(月) 14:53:07.97
ごめん引数の順序が逆になってる。
0212名無しさん@お腹いっぱい。2015/11/23(月) 15:08:42.76
でもまぁ書換えたりしない場合、大抵の事は前の人が書いてるように
grepの-Pを使うといいと思う。
0213名無しさん@お腹いっぱい。2015/11/23(月) 21:42:42.57
>>206
bashism

このスレ的にだけでなく一般的にも
bash 依存のスクリプトには、#!/bin/bash を付けた方が良いよ
0214名無しさん@お腹いっぱい。2015/11/24(火) 04:40:58.26
こんなのもありかな。以下だと表示するだけ実際にやる時は
echoを外してunset rをしてから行う事。
cat List.txt |while read
do
printf '%02d\n' $(( ++r )) |xargs -i echo mv {}.mp4 ${REPLY}.mp4
done
0215名無しさん@お腹いっぱい。2015/11/24(火) 06:19:42.03
そういう、スペース入りファイル名未対応回答はいいです
0216名無しさん@お腹いっぱい。2015/11/24(火) 07:10:44.29
ごめんねーzshだと大丈夫なんだけどな。
じゃあちょっと分らないな。
0217名無しさん@お腹いっぱい。2015/11/24(火) 07:13:51.39
しかし根本的なお勧めな解答をするならば、fileにはわざわざ音楽名をつけない事だね。
0218名無しさん@お腹いっぱい。2015/11/24(火) 07:15:07.67
zshを使ってないならそんな事なおさらだよ。
0219名無しさん@お腹いっぱい。2015/11/24(火) 08:53:18.61
>>214
xargsが無駄です。
catが無駄です。

r=0
while read
do
: $((r++))
echo mv $(printf %02d $r).mp4
0220名無しさん@お腹いっぱい。2015/11/24(火) 09:27:10.95
ていうか、>>214動く?
0221名無しさん@お腹いっぱい。2015/11/24(火) 10:13:12.69
こっちの台詞だよ。それ動くのかね。
0222名無しさん@お腹いっぱい。2015/11/24(火) 10:16:52.25
まあどうでもいいや。
0223名無しさん@お腹いっぱい。2015/11/24(火) 11:42:10.34
こっちってどっちだ
■ このスレッドは過去ログ倉庫に格納されています