シェルスクリプト総合 その32

■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2020/01/10(金) 16:05:57.94ID:c8NDboJX
GNU sed, GNU awk には --posix オプション、GNU bc には --standard
っていうオプションが用意されている
2020/01/11(土) 08:05:41.49ID:IVNUyUW+
知らんかった。ありがとう
351デフォルトの名無しさん
垢版 |
2020/01/11(土) 21:29:54.53ID:9SPVzhvj
やっぱzshクソ。pathとかstatusが特殊変数なのやめてくれ。
しかも大文字と小文字区別しねーし
path=hogehogeってやったら、環境変数PATHから検索しなくなる。
command not found!
2020/01/11(土) 23:34:38.48ID:NBzz9dXo
単にいままでのに慣れて違いを受け入れないってだけだな
2020/01/11(土) 23:39:31.73ID:NBzz9dXo
なんだ、単に zsh = ksh + tcsh ってのを理解してなくて的外れな文句言っているだけじゃん
アホらしい。文字通り
2020/01/12(日) 08:42:02.61ID:QbL/hexX
なんでそんなに攻撃的なんだよw
355デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:36:05.07ID:FpBV3Lt5
>>1より
> ・csh/tcshでのシェルスクリプトは*まったく推奨しません*

>>353
> なんだ、単に zsh = ksh + tcsh ってのを
kshにまったく推奨しないものを加えたら、クソになるんじゃないですかねぇ(笑)
356デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:39:05.21ID:u1ffAIxu
あと、環境変数の大文字と小文字は区別されてるのに
PATHに関してだけ区別されないのはどう考えてもクソだと思いますよ

pathに代入してもPATHが変わるってどう考えても
存在理由がない機能でしょw
2020/01/12(日) 11:22:16.69ID:QbL/hexX
まるでwindows…
2020/01/12(日) 17:34:52.15ID:J9pO5B5T
そんなに不満があるなら誰かがフォークしてそれがメジャーになってるだろ
俺が正しいって言ってもお前の頭の中ではだな
2020/01/12(日) 18:17:26.10ID:QbL/hexX
せやな。

事実一番メジャーなシェルはBashだしね。
2020/01/12(日) 18:54:12.07ID:J9pO5B5T
読めない自己紹介にしかなってないな
2020/01/12(日) 19:23:15.19ID:J9pO5B5T
>>356
わざわざ後付けで書いてあるのに根本的に何も理解しようとしてないだけだな
大文字小文字を判断してないじゃないよ、
PATHは単なる文字列pathは配列、
pathはcsh特有での、
PATHとpathという別の2つの環境変数
shモードcshモードを切り替えてなんていう実装ではなくちゃんぽんの可能な実装なので、PATH/pathをどちらか変更したら相対する方にも同期するというのだろ。そもそもcshでのpathがそういうものらしいが
内部的に参照しているのはpathの方かな。同期されない特定状態の場合から(どういうときか探してみようw)

今まで使っていたのと違うというだけじゃ話にならない、俺が正しいって言ってもお前の頭の中ではだなでしかないということ(>>355なんてそれが甚だしいけどw)
2020/01/12(日) 21:32:38.39ID:UPYAUoGA
cshがーっていうけど、zshとcshに互換性はまったくないじゃん
真似しなくていいものを真似した結果、貴重な短い変数名が
使えなくなってしまったことに違いはないんだけど
2020/01/12(日) 21:53:04.90ID:J9pO5B5T
作りもしないのに何を文句だけ言っているのだか。そんなに俺が偉いしたいの?
This is a shar file containing zsh, a ksh/tcsh-like shell.
というコンセプトで始めてるんだよ、その成果が認められているのは有名ディストリでもパッケージとしてあるんだから明らかだろう

そんなに俺の考えたのが最強なら作ってみればいいじゃん、フォークしてでも。世界に名を轟かせるいい機会だぞ、こんな匿名で偉そうに評論してんじゃなくw
2020/01/12(日) 22:07:46.46ID:7H3TRCXg
zshのクソ機能をクソ機能と言っただけで
なにファビョってるんだろう?

お前が作ったわけでもないだろうに
バカにされたとでも思ってるのか?
2020/01/12(日) 22:14:00.70ID:J9pO5B5T
クソ機能をクソ機能と言えるほど全然賢くないのが明らかなのに、自覚のないヤツ(ら?)だなあという。自覚がないようだからでしかないんだがな

いや、そのコメでますますアレでしかないなあ。自分は何かをクソと呼ぶが、自分が同じように呼ばれると聞かないって、じゃあ、そもそもどういうつもりでクソと呼んでいるのか?哲学だよww
結局俺偉いだけもしくはただの根拠のない感情だけだから、俺が自分自身と同じだと思ってそんなコメすんだろな?としか思えんけど
2020/01/12(日) 22:26:10.29ID:7H3TRCXg
うわっw なんだろう、これ美味しくないって言ったら
お前は料理できるんか?みたいな反応

ただの評論家だろ、評論家は評論するな!
自分で料理しろ、自分で自分で絵をかけ、自分で歌を歌え
プロよりうまくなかったら、評価する資格なし。みたいな極端な考えw
2020/01/12(日) 22:29:57.49ID:J9pO5B5T
わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん
それに対して、そんなことないぞなぜなら〜と返しているのだが。なにか問題があるか?
料理調理の内容がというなら自分で作れというのはいたって当たり前だろう。不満があったら自分で調理するのがOSSだからな

結局俺偉いってだけで反論を許さない、なぜなら俺偉いからというだけかw
2020/01/12(日) 22:36:44.16ID:7H3TRCXg
> わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん

レビュー。Googleもやってるで
2020/01/12(日) 22:39:15.15ID:J9pO5B5T
ちょっと意味がわからんが、ああいうとこはやりとりはしないできないだろ
てか、ど素人かよ。スクリプトであってもまがりなりにも何か自分で作っているのに未だど素人かよと思ってしまうな、クレーマーレベルすぎてw
370デフォルトの名無しさん
垢版 |
2020/01/13(月) 05:57:08.53ID:iUioslZh
そんなに気に入らないなら自分で新しいシェル作れば良いのに。
2020/01/13(月) 06:56:27.50ID:00IYKkjv
信者の例

新しいバトルシステムが使いづらい
→ そんなに気に入らないなら自分で新しいゲーム作れば良いのに

「設定」が使いづらい
→ そんなに気に入らないなら自分でOS作れば良いのに
2020/01/13(月) 12:47:53.36ID:cEXtDkBR
ナポレオン「私は卵を産めないが、卵が腐っていると判断できる」

(Zshの利用者が満足するような)シェルを作れる自信はないが、
Zshの一部機能を腐ってるとは言える。

ていうか他の人も指摘してたけど二三の欠点を指摘されただけで
まるで自分の人格を全否定されたかのような反応をするのってどういう感情なんだろう?
2020/01/13(月) 15:10:18.33ID:v+Mp6rDH
psコマンドで見て a.out で実行されているプロセスを全部 kill -9 してくれるスクリプトってどう書いたらいいですか
2020/01/13(月) 15:12:27.51ID:stzsvKPq
教えてあげないよじゃん
2020/01/13(月) 15:35:35.00ID:v+Mp6rDH
約に立たない2chのクズ共が自分で調べた方が早い

ps | grep "./a.out" | grep -v grep | awk '{ print "kill -9", $1}' | sh
2020/01/13(月) 15:47:43.19ID:GhUCXbF0
374は屑だが回答ないと豹変するのもどうかと
2020/01/13(月) 16:00:10.75ID:L1QEfUqR
killall でいいんじゃないかな
2020/01/13(月) 16:03:48.34ID:cEXtDkBR
煽って回答を貰うのはよく見掛ける光景だけど
煽りながら自己解決するのは珍しいなw
2020/01/13(月) 16:56:48.83ID:48BANHU6
zshはbashの強化版だと思ってたら違うのね
bashを覚えるので手一杯なんで他のシェルに浮気する余裕ないけど
2020/01/13(月) 22:41:06.83ID:ybxFvJaC
シェルスクリプトとしてはzshは使わないね。
bashとだいたい互換性があるシェル。
スクリプトとしてはPOSIX準拠にするかbashでしょう
2020/01/13(月) 23:52:57.18ID:HaVRjpT+
>>379
派生、元とした流れが全く違うからね
新しい機能つけるのに相互に参照してたり参考にしてたりするかもだが
2020/01/14(火) 00:50:43.36ID:/0srrHag
macでosアップデートしたらzsh強制になったんだが
2020/01/14(火) 03:49:13.20ID:GtH+RxOj
アップデートでは強制にならないよ
アップデートでなくても強制でもないし、単なるデフォ
2020/01/14(火) 16:08:03.31ID:5kcRpVJe
いつもの
https://i.imgur.com/Gn7TNci.jpg
2020/01/14(火) 18:06:08.65ID:Xjyusg2Z
>>384

>>2のリンク先にオリジナルが書いてあるから、
どこぞに転載されたものを貼り付けなくていい
2020/01/14(火) 18:09:26.71ID:Xjyusg2Z
この図 https://tangentsoft.com/misc/unix-shells.svg を見ると
zshはtcshを取り入れてると言うが、正確にはそれをやったのはKornShellで
その後継のksh88が、POSIX shellやbash等の現存する全てのシェルの祖先に
なるわけだから、zshと同様にdashやbashなんかもtcshを取り入れてることになるんだよな。
2020/01/14(火) 18:10:25.17ID:Xjyusg2Z
ksh2020でたからこの図更新してくれんかなw
2020/01/14(火) 18:46:58.03ID:3k/caRNi
kshってなんか凄いんだな

昔、AIXでksh書いた事あるけど
AIXぐらいでしかインストールされてる環境に出逢ったことない
Solarisでbsh書いてた後に触って配列使えて感動したのを覚えてる
また使ってみるかなぁ
2020/01/14(火) 23:00:12.31ID:eC6vK415
>>386
図だけで想像しすぎ
kshで取り入れたのはヒストリ機能などの極めて一部
そういろいろいうなら、ちゃんと調べた方がいいよ
2020/01/14(火) 23:05:01.84ID:eC6vK415
>>388
インストールというのならmacOSも昔から標準で入ってる
デフォルトログインシェルなのはAIXぐらいらしいね
2020/01/15(水) 00:00:09.35ID:kWU6CwmB
UNIXでbshができる
BSDでcshができる
改良版のtcshができる
bshにtcshを追加したkshができる
kshが商用だったので派生が拡がる
軽量版bshのashができる
Lnux版ashのdashができる
GNU版bshのbashができる
機能マシマシのzshができる
独立系のfishができる

こんな感じか
文字の修正とか昔のbashにはなかったらしいな
2020/01/15(水) 00:15:20.12ID:iV6SKP+H
デジャヴな適当なまとめレス
2020/01/15(水) 00:24:02.07ID:PiCqpD5C
fishは全然関係ねー
互換性がない別物
394デフォルトの名無しさん
垢版 |
2020/01/15(水) 07:03:57.56ID:kWU6CwmB
関係ないから独立系にしたんだけど
2020/01/15(水) 07:44:52.57ID:YlxQUfnE
それ依然に単に図を適当に日本語にしただけの説明なんてしなくていいから。
2020/01/16(木) 07:51:49.13ID:kJFHtYN8
TETって使ってる?
OpenGroupが配布してる適合テスト
2020/01/17(金) 08:13:43.25ID:z4CRALQ3
しらん
398デフォルトの名無しさん
垢版 |
2020/01/19(日) 08:08:23.81ID:q9WTUin1
例えば'100 50'を渡すとして、コマンドと実行結果がそれぞれ
awk '$0' #100 50
awk '$0+=1' #101
awk '$0+=$0' #200
awk '$0+=$2/2' #125
awk '$1+=$2/2' #125 50
みたいになったのですが、内側3つの挙動がよく分かりません。
予想ではそれぞれ'101 51'や'200 100'や'125 75'等になると思っていたのですが、
$0って計算式を書き込むと$1を表示する仕組みなんでしょうか…?
2020/01/19(日) 09:17:02.04ID:qcodQ+dh
$1, $2 などは、フィールド(列)変数。
$0 は、入力レコード(行)全体

こういう特別な変数に、代入してはいけない!
読み込む事だけに使うこと!
2020/01/19(日) 11:47:43.00ID:eoYSOV4S
それは言いすぎだろう。少なくとも gawk では何が起こるか明確になっている。
理解する気が無いならやらない方がいいというならその通りだ。
401デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:39:38.50ID:JpGnQ0ST
シェル芸の定義って、スクリプトファイル作らないで、シェル(CLI)を駆使して
実用的ではないネタを披露すること。でいいですかね?

いやあまりにもくだらないネタが多いんで
2020/01/19(日) 19:41:53.38ID:rMML9kO3
何が言いたいんだか
403デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:52:31.45ID:JpGnQ0ST
難読化シェル芸の解読
ながいPythonコードをシェル芸で実行させる
じわじわ広がる星型模様シェル芸
動く!電光掲示板シェル芸
ボディビルダーが泳ぐシェル芸
アイドルグループが46か48かわからなくなったときにワンライナーで解決する方法
鬼滅の刃の幾何学模様シェル芸
踊るgifシェル芸
ojichatグラフシェル芸
3の倍数と3が付く数字のときだけアホになるシェル芸
床屋シェル芸
闇シェル芸「さあ、闇のゲーム(シェルゲイム)の始まりだぜ!」
実践 キングウンコの作り方
画像っぽい素数をシェル芸でつくる
fish起動時にサイゼリヤ1000円ガチャの結果を表示する
【危険シェル芸】禁じられた闇の魔術とその防衛術??
2020/01/19(日) 19:54:37.30ID:ExWppFRM
>>400
POSIXでも、
The symbol $0 shall refer to the entire record; setting any other field causes the re-evaluation of $0. Assigning to $0 shall reset the values of all other fields and the NF built-in variable
と明言してるね。$1〜$nを変えれば$0が再構築され、$0を変えれば$1〜$nとNFが作り直される風に
2020/01/19(日) 20:01:00.70ID:ExWppFRM
>>403
ふむ
それがくだらなくないレスなのか。読んだ時間を返せw
2020/01/20(月) 04:39:32.79ID:JFurewkA
>>351
っPowerShell
2020/01/20(月) 15:24:29.08ID:oVJVVsJQ
>>399 >>404
ありがとうございます、普通に動くから大丈夫だと思ってましたm(_ _)m
とりあえず今後は素直にprintで出力します
2020/01/21(火) 12:52:55.03ID:m6IPx8KZ
kshって今時だとninjaとか使うんか…
昔ながらのMakefileじゃないんだね
2020/01/21(火) 21:11:00.03ID:Mn6KsPak
教えていただきたいことがあります。
ワンクリックで複数のターミナルを開いてそれぞれで別々のコマンドを動かすスクリプトを書きたいと思っています。
gnome-teminalにオプションつけたらいけるかと思いますしたが、うまく行かなくて、、なにかアドバイスいただけないでしょうか
2020/01/22(水) 07:07:11.43ID:uCiji4On
gnome-terminal なら -- の後に実行したいコマンドを書けばいいだけみたいだけど
動いているが挙動がイマイチとかじゃないの?
うまく行かないって、そのままTerminalとしてウィンドウを残しておきたいとか引き続きインタラクティブでなんかしたいとか?
2020/01/22(水) 07:22:53.82ID:uCiji4On
GUI Terminalアプリは一般的にコマンドが実行し終えたらアプリも終える=ウィンドウも消えるという、まあそうなるか的な(まあshもそうだし)
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ

shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw
2020/01/22(水) 20:17:38.02ID:IMIM4EWG
返信ありがとうございます!
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。
2020/01/22(水) 20:31:41.36ID:aGAY9ZaD
ffplayって自分で独自のウィンドウ開くんじゃないの?
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??
2020/01/22(水) 20:38:59.30ID:0dPQnm43
>>413
説明不足ですみません、、
そうなんです、ログも同時に複数表示させたくて
2020/01/22(水) 21:18:09.64ID:aGAY9ZaD
for i in 1 2 3 4; do
gnome-terminal -- ffplay $i.fifo
done
で、再生中はTerminalウィンドウも健在でログも見えるんじゃないの。ffplayが終了したらTerminalウィンドウは閉じてしまう
gnome-terminal -- sh -c "ffplay $i.fifo;sh"
で、Terminalウィンドウも残ると思うけど。Terminalウィンドウでffplayを終了させようとctrl-cすると、後のsh起動まで行かないけど
2020/01/22(水) 21:37:15.05ID:0dPQnm43
>>415
ありがとうございます!!
できました!
先週linux初めて触って分からないことだらけで、お手数おかけしました、、
2020/01/25(土) 17:35:52.15ID:2I6NhO3j
index=2,INFO1="abc",INFO2="ab,c"
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。

IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…
2020/01/25(土) 19:29:47.91ID:nGGHbHoP
なんか前も似たような話があった気がするな
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw

CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw
2020/01/25(土) 19:31:22.74ID:nGGHbHoP
あ、IFSをカンマにしてから、evalに渡せばできるんじゃね?
2020/01/25(土) 19:32:25.51ID:nGGHbHoP
あ、evalじゃだめか。setがいるか
2020/01/25(土) 19:44:38.62ID:nGGHbHoP
setはいらんかったw
あとはスペースが入ってるときかー、どうやって対処するかな?
2020/01/25(土) 20:29:47.31ID:2I6NhO3j
>>418
CSV形式の一種なのかな。
ただ改行はなくて、常に一行。
あと引用符はあったりなかったりする。

具体的には、m3u8プレイリストの一部を処理したいのよね。
2020/01/25(土) 20:29:55.33ID:S3XsKqnt
プログラミング言語でやったことあるけど
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした

最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる
2020/01/25(土) 20:48:15.05ID:2I6NhO3j
超具体的に言うと(てかここまで直接に状況を晒すとクレクレみたくなるなw)

“playlist.m3u8”っていうファイルだとして

↑こういう形式の行が沢山あるんだけど、
ここのRESOLUTIONの値と対応するMOVIE-URIの値をずらずら欲しい。

IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8
2020/01/25(土) 20:49:51.89ID:2I6NhO3j
>>423
自分で生成するんだったら区切り文字は絶対に
他の文字と被らないようにするんだけどね……
2020/01/25(土) 21:15:13.22ID:nGGHbHoP
面倒になったー

index=2,INFO1="abc",INFO2="ab,c"

index=2 INFO1="abc" INFO2="ab c"
に変換すれば

evalできるよ!

あとは頑張ってー
2020/01/25(土) 22:38:09.23ID:2I6NhO3j
>>426
それだと引用符の中のカンマまで変換されちゃうのよね。
まあ、もう簡単に処理する方法はあきらめて
AWKやらでガシガシ解析するしかないw
2020/01/25(土) 22:39:10.68ID:nGGHbHoP
>>427
戻せばいいよー
2020/01/25(土) 22:40:41.08ID:nGGHbHoP
んー?戻すとなったらset使ったほうがいいんか?

eval set -- index=2 INFO1="abc" INFO2="ab c"

$1, $2,・・・代入されるからに処理しやすい
2020/01/25(土) 22:41:54.41ID:nGGHbHoP
> AWKやらでガシガシ解析するしかないw

シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー
2020/01/25(土) 22:43:30.45ID:nGGHbHoP
こういうのってawkで高度(?)な機能と発想の転換で使ってこなすより
1文字ずつ処理したほうが楽でわかりやすいよな
2020/01/26(日) 01:20:08.20ID:GaEtLwpN
GNU awk なら FPAT が使える

echo 'index=2,INFO1="abc",INFO2="ab,c"' |
gawk -vFPAT='[^=,"]+=("[^"]*"|[^,]*)' '{print gensub(FPAT, "\\1", "g")}'

=> 2,"abc","ab,c"
2020/01/26(日) 01:26:07.97ID:gf7z5zyj
>>432
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握

大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる
2020/01/26(日) 01:31:16.29ID:GaEtLwpN
いやぁ、こっちからみると eval や set を使う方がツラいわ…
2020/01/26(日) 01:38:47.61ID:3NTRDHS2
evalやsetは普通にシェルが文法を解釈するのと
同じ動きをするだけなんだからシンプルだろ

シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる
2020/01/26(日) 01:48:36.68ID:GaEtLwpN
FPATって単なる正規表現(ERE)でしかないけどな。個人的には正規表現で
考える方が楽でいいし確実。以前に同じ様な事があったけど、

・変数名にもカンマを使いたい(SQLみたいにバッククォートで括る)
・値の方には複数行のテキストを入れたい(newlineを使える様にして)

っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決
2020/01/26(日) 02:14:38.87ID:3NTRDHS2
そもそも正規表現は単語(文字の並び)を見分けるもので
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ

本来得意ではない意味を区別できるよう拡張していったら
逆にコード見ても何をしているか意味がわからなくなってる

コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ
2020/01/26(日) 02:21:54.35ID:GaEtLwpN
eval 使うのは面白いけど、

$ eval $(echo 'id=$(whoami),hostname=$(hostname),date="$(date)"' | tr , ' ')

fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…
2020/01/26(日) 03:03:54.87ID:GaEtLwpN
m3u8-file-parser(http://npm.taobao.org/package/m3u8-file-parser)なんてのがあるな
playlist のフォーマットって RFC8216 で定義されていたのね
2020/01/26(日) 09:15:52.32ID:EvZHCPY7
https://tools.ietf.org/html/rfc8216#section-4.2
属性列挙を解析したいって話か。
2020/01/26(日) 11:48:02.12ID:EvZHCPY7
>>427
AWKで解析するとして、コンマが引用符の中かそうじゃないかなんて判断できるのかな?
正規表現は>>423も言ってる通り単に文字の並びを指定するもので
ある箇所での文字の「意味」は定義できないからこういう作業には向いてなさそう。
442デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:26:43.97ID:XFNlR92Q
てかお前らいつまで化石みたいな話してんの?
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw

もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで
2020/01/26(日) 13:39:38.23ID:IghF1+Kj
Perl ならこんな感じか。

perl -ne 'while ( /(("[^"]*"|[^,])+)/g ){ print("$1\n") }'

Perl にも CSV を扱うモジュールはあるけどね。
2020/01/26(日) 13:42:52.65ID:EvZHCPY7
ちょっとやろうとしてみたけど
_var='a b "a,b" c "a b"'
IFS=' '
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a,b
c
a b
になるのに、
_var='a,b,"a,b",c,"a b"'
IFS=','
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a b
c
a b
↑こうなってしまうのでevalとsetでどうにかするのはかなり難しそう。
(コンマの情報が潰されちゃう)

シェルスクリプトで自作するのに拘ってるみたいだけど
m3u8パーサ?使うべきじゃないかなぁ。
2020/01/26(日) 14:11:49.86ID:GaEtLwpN
>>443
Perl(PCRE)だと non-greedy matching が使えるからいいよね
とすると GNU grep ではこんな感じ

grep -Po '((".*?"|[^,])+)'
2020/01/26(日) 16:19:39.04ID:5vRllc8t
なんかハマってるなw

例えば最初がこれだとするだろ?
index=2,INFO1="a bc",INFO2="ab,c"

ダブルクォートの中にスペースが入ることがあるとして、まずスペースをありえない文字(制御文字)に変換するだろ?
index=2,INFO1="a<DEL>bc",INFO2="ab,c"

次にカンマをスペースにするだろ?
index=2 INFO1="a<DEL>bc" INFO2="ab c"

これをeval + setするだろ?
eval "set -- $DATA"

そうすると、こうなるやんか?
$1: index=2
$2: INFO1="a<DEL>bc"
$3: INFO2="ab c"

あとはループして、<DEL>をスペースに戻しつつevalすればOKだよ

文字の置換はIFS使って分割して結合
俺が悩んでたのは、実はありえない文字に変換しないで
できないかなーってところなんだよねw

>>438
そういうのは仕様。それを防ぎたかったらevalは使えないのでパースするしか無い
もしくはエスケープ+evalだけどエスケープするために結局パースが必要になる
2020/01/26(日) 16:34:10.53ID:GaEtLwpN
http://npm.taobao.org/package/m3u8-file-parser に載ってる m3u8 のサンプル
を見るとこういう行もある

#EXTINF:23.222 tvg-logo="haha, ddd" tvg-aa="sb@" tag=sa, Sample artist, : - Sample title
2020/01/26(日) 17:19:14.35ID:EvZHCPY7
<https://tools.ietf.org/html/rfc8216#section-4.2>;によるといずれの形式の属性値も読点を含んではならないとあるのに,

例えば<https://tools.ietf.org/html/rfc8216#section-4.3.4.2>;のCODEC属性値の説明には「引用符で囲まれた読点区切りの…」とある。

もしもAttributeValueの形式に全部のタグが従っていたら,上での細かい話は要らずに
IFS=','やらawk -v FS=','やらいくらでも方法はあったのにね。

ざっと見たところ,属性値であるにもかかわらず読点を含むという仕様になってるのは例にも挙げた
#EXT-X-STREAM-INF:タグのCODEC属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。
2020/01/26(日) 17:24:07.99ID:EvZHCPY7
中身のない連投すまんが,
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。

>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>;に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況