シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/)
探検
シェルスクリプト総合 その28
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
2018/07/24(火) 11:01:16.36ID:r0TJj2hB866デフォルトの名無しさん
2018/09/15(土) 17:01:07.67ID:Svn0IWNp >>865
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
867デフォルトの名無しさん
2018/09/15(土) 17:19:32.41ID:8KftQgLD >>866
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな
なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?
bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな
なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?
bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
869デフォルトの名無しさん
2018/09/15(土) 17:42:37.90ID:pm09nqHo >>865
forkされる場合ってのはわかりやすいんだけどね
> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2
実行するのがシェルビルトインコマンドであっても実行後は元に戻る
ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動
ということで
> A=123 echo "$A-1"
と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
forkされる場合ってのはわかりやすいんだけどね
> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2
実行するのがシェルビルトインコマンドであっても実行後は元に戻る
ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動
ということで
> A=123 echo "$A-1"
と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
870デフォルトの名無しさん
2018/09/15(土) 17:43:08.57ID:pm09nqHo ちなみにコマンドライン(シェル)じゃなくて
スクリプトを書いて実行して確かめてる
スクリプトを書いて実行して確かめてる
871デフォルトの名無しさん
2018/09/15(土) 17:56:26.73ID:pm09nqHo 知ってると思うんだけど、念の為
var=value command
この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
var=value command
この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
872デフォルトの名無しさん
2018/09/15(土) 18:00:22.45ID:pm09nqHo 話を簡単にすると
A=
A=123 eval :
echo $A
dashだと123と表示される。
bashだと何も表示されない。
A=
A=123 eval :
echo $A
dashだと123と表示される。
bashだと何も表示されない。
873デフォルトの名無しさん
2018/09/15(土) 18:15:21.72ID:SSTURz0o >>872
ふむ、bash で set -o posix してから実行すると 123 って表示されるね
ふむ、bash で set -o posix してから実行すると 123 って表示されるね
874デフォルトの名無しさん
2018/09/15(土) 18:22:17.36ID:pm09nqHo875デフォルトの名無しさん
2018/09/15(土) 18:34:31.19ID:8KftQgLD876デフォルトの名無しさん
2018/09/15(土) 18:43:07.13ID:pm09nqHo >>875
それは単に「VAR=var echo $VAR」が1行だから
先に$VARが展開されるだけだと思うよ
変数を一時的に変更したいけど、別変数にバックアップして元に戻すの面倒だな
その他にも方法あるけどアレ(省略)だし、
よし、var=value command構文を使おう!
うお、先に$VARが展開されちまった
ぴこーん!だったらeval使えば先に展開されることないんじゃね?
よし動い・・・あれぁ、変数を一時的に変更したかったのに
実行終わっても変数が元に戻らないよぉ
よし5ちゃんねるだ。という流れw
それは単に「VAR=var echo $VAR」が1行だから
先に$VARが展開されるだけだと思うよ
変数を一時的に変更したいけど、別変数にバックアップして元に戻すの面倒だな
その他にも方法あるけどアレ(省略)だし、
よし、var=value command構文を使おう!
うお、先に$VARが展開されちまった
ぴこーん!だったらeval使えば先に展開されることないんじゃね?
よし動い・・・あれぁ、変数を一時的に変更したかったのに
実行終わっても変数が元に戻らないよぉ
よし5ちゃんねるだ。という流れw
877デフォルトの名無しさん
2018/09/15(土) 18:52:32.83ID:8KftQgLD >>876
もうとっくに分かってると思うが 俺が思い付いたのは
$ VAR=val-b4
$ (VAR=val-tmp; echo $VAR)
→ val-tmp
$ echo $VAR
→ val-b4
くらいだな
もうとっくに分かってると思うが 俺が思い付いたのは
$ VAR=val-b4
$ (VAR=val-tmp; echo $VAR)
→ val-tmp
$ echo $VAR
→ val-b4
くらいだな
878デフォルトの名無しさん
2018/09/15(土) 19:22:09.86ID:imSsWev+ https://i.imgur.com/VhwX2Fq.jpg
このスクショのようにmediainfoというコマンドのAudioの項目のFormatを取り出す方法教えてほしいです
。
以前はそのAudioのFormatという文字列はFormat profileだったので、
mediainfo "$FILE" | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/'
こうやってその行を抽出していたんですが、mediainfoがバージョンアップしてFormatという文字列に変わってしまいました。
Generalの項目にもFormatがあるので、これだと調べられません。
どうやるんでしょうか?
このスクショのようにmediainfoというコマンドのAudioの項目のFormatを取り出す方法教えてほしいです
。
以前はそのAudioのFormatという文字列はFormat profileだったので、
mediainfo "$FILE" | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/'
こうやってその行を抽出していたんですが、mediainfoがバージョンアップしてFormatという文字列に変わってしまいました。
Generalの項目にもFormatがあるので、これだと調べられません。
どうやるんでしょうか?
879デフォルトの名無しさん
2018/09/15(土) 19:37:37.26ID:SSTURz0o GNU sed の -r オプション使ってるけど、こんな感じで
$ mediainfo "$FILE" | sed -nr '/^Audio/,$s/^Format +: (.+)/\1/p'
$ mediainfo "$FILE" | sed -nr '/^Audio/,$s/^Format +: (.+)/\1/p'
880デフォルトの名無しさん
2018/09/15(土) 19:38:31.49ID:pm09nqHo >>878
mediainfo "$FILE" | sed -n -E '/Audio/,/\s*$/{s/Format\s*:\s//p}'
mediainfo "$FILE" | sed -n -E '/Audio/,/\s*$/{s/Format\s*:\s//p}'
881デフォルトの名無しさん
2018/09/15(土) 19:41:31.43ID:SSTURz0o ヘルプメッセージ読んだらこれでいいかも
$ mediainfo --Inform="Audio;%Format%" "$FILE"
$ mediainfo --Inform="Audio;%Format%" "$FILE"
882デフォルトの名無しさん
2018/09/15(土) 19:41:51.97ID:pm09nqHo Audioにformatが複数あっても対応できないかなー?ってやってたら遅れたw
883デフォルトの名無しさん
2018/09/15(土) 19:42:08.44ID:8KftQgLD >>878
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s
これでどうだろう?
ところで綺麗な端末だね。
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s
これでどうだろう?
ところで綺麗な端末だね。
884デフォルトの名無しさん
2018/09/15(土) 19:42:36.17ID:8KftQgLD ちょっと確かめてたらめっちゃ回答ついてたw
885デフォルトの名無しさん
2018/09/15(土) 19:43:35.86ID:8KftQgLD ちなみに俺のコマンドラインはPOSIXに準拠してるので可搬性は高いと思うよ(ドヤ顔)
886デフォルトの名無しさん
2018/09/15(土) 19:50:28.32ID:pm09nqHo887デフォルトの名無しさん
2018/09/15(土) 19:57:27.53ID:SSTURz0o >>886
>> GNU sed の -r オプション使ってるけど、こんな感じで
>-r じゃなくて -E を使えば良いのでは?
>POSIX準拠?かどうか知らないけど-Eは使えるはず
癖で指が -r を押してしまう…以後気をつけます
>> GNU sed の -r オプション使ってるけど、こんな感じで
>-r じゃなくて -E を使えば良いのでは?
>POSIX準拠?かどうか知らないけど-Eは使えるはず
癖で指が -r を押してしまう…以後気をつけます
888デフォルトの名無しさん
2018/09/15(土) 19:59:15.83ID:pm09nqHo Macだと\sは使えないのかな?
とりあえず>>879を参考にしつつ修正してみた。
General、Audio、の次になにか来ても対応できるようにしてみた。
これなら-Eいらんかったわ。macOSで動くのを確認済み
sed -n '/^Audio/,/^$/ s/^Format *: *// p'
とりあえず>>879を参考にしつつ修正してみた。
General、Audio、の次になにか来ても対応できるようにしてみた。
これなら-Eいらんかったわ。macOSで動くのを確認済み
sed -n '/^Audio/,/^$/ s/^Format *: *// p'
889デフォルトの名無しさん
2018/09/15(土) 20:01:46.68ID:pm09nqHo -Eが良いよ(ドヤァ)
POSIX準拠というより可搬性重視なので、
-Eが使えるなら-Eつけてれば良いんじゃね?ぐらいに思ってるw
POSIX準拠というより可搬性重視なので、
-Eが使えるなら-Eつけてれば良いんじゃね?ぐらいに思ってるw
890デフォルトの名無しさん
2018/09/15(土) 20:06:03.93ID:pm09nqHo >>883
> grep '^Format' | cut -f '2-' -d ':' -s
grepしてcutするって流れは、俺もよくやるんだけど、
awk一つにまとめられる(と後からよく気づくw)
> grep '^Format' | cut -f '2-' -d ':' -s
grepしてcutするって流れは、俺もよくやるんだけど、
awk一つにまとめられる(と後からよく気づくw)
891デフォルトの名無しさん
2018/09/15(土) 20:13:17.74ID:8KftQgLD >>890
でもなんかその操作をawk一つにまとめるって
emacsのorgモードに近い印象を受けるというか
ちょっとUnix哲学っぽくねえなと思う。
もちろんUnix哲学に従う必要性は皆無なんだけど,あくまで個人的な意見として。
でもなんかその操作をawk一つにまとめるって
emacsのorgモードに近い印象を受けるというか
ちょっとUnix哲学っぽくねえなと思う。
もちろんUnix哲学に従う必要性は皆無なんだけど,あくまで個人的な意見として。
892デフォルトの名無しさん
2018/09/15(土) 20:16:21.20ID:pm09nqHo >>891
それ言ったらsedは今回、範囲選択+行選択+置換 の3つを同時にやってるんやで?w
それ言ったらsedは今回、範囲選択+行選択+置換 の3つを同時にやってるんやで?w
893デフォルトの名無しさん
2018/09/15(土) 20:20:10.43ID:8KftQgLD894デフォルトの名無しさん
2018/09/15(土) 20:41:53.02ID:pm09nqHo sedもawkも複数行のスクリプトを実行できるわけで
一つのコマンドで複雑な異なる機能を提供してるから
Unix哲学から反してるのかもね
だから例のアレはUnix哲学がどうとか言ってる割に
結局awkでプログラム書くんかいって突っ込みたくなるんだな
一つのコマンドで複雑な異なる機能を提供してるから
Unix哲学から反してるのかもね
だから例のアレはUnix哲学がどうとか言ってる割に
結局awkでプログラム書くんかいって突っ込みたくなるんだな
895デフォルトの名無しさん
2018/09/15(土) 20:45:00.31ID:8rxpHkWL まだとどまる事のない誤解を披瀝し続けとってわろたw
896デフォルトの名無しさん
2018/09/15(土) 21:28:41.91ID:imSsWev+ みなさんどうもありがとうございます!
>>881
おお!こんなオプションがあったんですか!って思って試してみたんですが、
上のスクショのLC-AAC-Sample.aac、HE-AAC-Sample.aacで試すと、どちらもAACと表示され、
このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
INFO=$(mediainfo "$FILE" | sedほげほげ"
case "$INFO" in
"AAC LC" )
ほげほげ1
"AAC LC SBR")
ほげほげ2
*)
ほげほげ3
って感じで次の処理に進むんですが、
>>879、880、888だとほげほげ1か2に進めて、>>883だとほげほげ3になってしまいました。
>>881
おお!こんなオプションがあったんですか!って思って試してみたんですが、
上のスクショのLC-AAC-Sample.aac、HE-AAC-Sample.aacで試すと、どちらもAACと表示され、
このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
INFO=$(mediainfo "$FILE" | sedほげほげ"
case "$INFO" in
"AAC LC" )
ほげほげ1
"AAC LC SBR")
ほげほげ2
*)
ほげほげ3
って感じで次の処理に進むんですが、
>>879、880、888だとほげほげ1か2に進めて、>>883だとほげほげ3になってしまいました。
897デフォルトの名無しさん
2018/09/15(土) 21:30:45.05ID:imSsWev+ >>883
端末はMacのiTerm、シェルはfish、プロンプトは適当にいじったやつです。
端末はMacのiTerm、シェルはfish、プロンプトは適当にいじったやつです。
898デフォルトの名無しさん
2018/09/15(土) 21:43:49.56ID:pm09nqHo >>896
> このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
ちゃんと調べた? %Format%以外で出るのあるんじゃないの?
> このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
ちゃんと調べた? %Format%以外で出るのあるんじゃないの?
899デフォルトの名無しさん
2018/09/15(土) 21:59:26.07ID:imSsWev+ >>898
Audio;%Format/Info%
だと上のスクショの
Advanced Audio Codec Low Complexityなになに
が取り出せるようでした。
これだとLC AACならAdvanced Audio Codec Low Complexity
HE-AACならAdvanced Audio Codec Low Complexity with Spectral Band Replication
が取り出せるので判別出来そうです。
Audio;%Format/Info%
だと上のスクショの
Advanced Audio Codec Low Complexityなになに
が取り出せるようでした。
これだとLC AACならAdvanced Audio Codec Low Complexity
HE-AACならAdvanced Audio Codec Low Complexity with Spectral Band Replication
が取り出せるので判別出来そうです。
900デフォルトの名無しさん
2018/09/15(土) 22:08:36.45ID:8KftQgLD901デフォルトの名無しさん
2018/09/15(土) 22:18:17.17ID:8KftQgLD >>899
ところで
http://www.mpeg-audio.org/members/files/DASH_Files/Audio_Only_Stereo_Dash.zip
↑こっからDLできるサンプルファイルで試したところ
AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
と
HE-AAC/Technology-en-69s-2-heaac-64000bps_seg.mp4
は
mediainfoの出力結果で
Audio;FormatではどちらもAAC表示で区別できず
Audio;Format profileでやっと区別できるんだけど,俺の勘違いかな。
ところで
http://www.mpeg-audio.org/members/files/DASH_Files/Audio_Only_Stereo_Dash.zip
↑こっからDLできるサンプルファイルで試したところ
AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
と
HE-AAC/Technology-en-69s-2-heaac-64000bps_seg.mp4
は
mediainfoの出力結果で
Audio;FormatではどちらもAAC表示で区別できず
Audio;Format profileでやっと区別できるんだけど,俺の勘違いかな。
902デフォルトの名無しさん
2018/09/15(土) 22:25:58.84ID:8KftQgLD 何度も投稿してすまん。
これでいいんじゃないかな。
確かめた環境はMediaInfo 0.7.91 on Debian 9.5。
case "$(mediainfo --Inform='Audio;%Format_Profile%' "$FILE")" in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
これでいいんじゃないかな。
確かめた環境はMediaInfo 0.7.91 on Debian 9.5。
case "$(mediainfo --Inform='Audio;%Format_Profile%' "$FILE")" in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
903デフォルトの名無しさん
2018/09/15(土) 22:45:32.78ID:pm09nqHo >>896のコード見て思うのは
Unix哲学(を完全に受け入れたわけじゃないが)
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
すべてのプログラムはフィルタとして振る舞うようにしたとして
そのプログラムを使う側もフィルタとして利用するようにすべきだと思うわけよ
つまりね、こういうふうに書くべきじゃないのか?ってこと
mediainfo --Inform='Audio;%Format_Profile%\n' "$FILE" | while IFS= read -r line; do
case $line in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
done
本当は$FILEの所も"$@"にして複数ファイル対応できるようにしたい。
だけどメディアファイルっていうのはオーディオを複数入れることができるはずだから、
この場合どうなるのか?という疑問がある。その場合はうまくいかないかもしれない。
まあ適切なサンプルファイルを思いつかんし面倒だから試しては見てないが
Unix哲学(を完全に受け入れたわけじゃないが)
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
すべてのプログラムはフィルタとして振る舞うようにしたとして
そのプログラムを使う側もフィルタとして利用するようにすべきだと思うわけよ
つまりね、こういうふうに書くべきじゃないのか?ってこと
mediainfo --Inform='Audio;%Format_Profile%\n' "$FILE" | while IFS= read -r line; do
case $line in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
done
本当は$FILEの所も"$@"にして複数ファイル対応できるようにしたい。
だけどメディアファイルっていうのはオーディオを複数入れることができるはずだから、
この場合どうなるのか?という疑問がある。その場合はうまくいかないかもしれない。
まあ適切なサンプルファイルを思いつかんし面倒だから試しては見てないが
904デフォルトの名無しさん
2018/09/15(土) 23:39:36.74ID:imSsWev+ みなさんどうもありがとうございます
>>896の時点のコードは以下です
https://pastebin.com/qdNT6iBm
拡張子がaacのファイルがあるディレクトリでこのスクリプトを動かしたらaacファイル全て(ひとつづつ)処理させてます。
>>900-903
明日確認してみます
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
以前のバージョンではFormat profile欄があったのでそこで判別してたんですが、いつのまにか(昨日気がつきました)最近のバージョンではFormat profile欄がなくなっているんです。>>878のスクショです
>>896の時点のコードは以下です
https://pastebin.com/qdNT6iBm
拡張子がaacのファイルがあるディレクトリでこのスクリプトを動かしたらaacファイル全て(ひとつづつ)処理させてます。
>>900-903
明日確認してみます
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
以前のバージョンではFormat profile欄があったのでそこで判別してたんですが、いつのまにか(昨日気がつきました)最近のバージョンではFormat profile欄がなくなっているんです。>>878のスクショです
905デフォルトの名無しさん
2018/09/15(土) 23:59:46.80ID:8KftQgLD >>904
なるほどね。Debainのaptで入れたやつは古いのか。
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/HE-AAC/Technology-en-69s-2-heaac-32000bps_seg.mp4
LC SBR
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
LC
これは結構見分けやすいんじゃないか?
なるほどね。Debainのaptで入れたやつは古いのか。
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/HE-AAC/Technology-en-69s-2-heaac-32000bps_seg.mp4
LC SBR
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
LC
これは結構見分けやすいんじゃないか?
906デフォルトの名無しさん
2018/09/16(日) 00:12:32.41ID:ynEgKPZ+ >>904
ちょっと訊きたいんだけど,MPEG4のLCとHEの違いってSBRが適用されてるかいなかの差?
もしそうならまさにそのオプションがあって
mediainfo --Output='Audio;%Format_Settings_SBR%'
↑これは,SBRが含まれていれば“Yes (Explicit)”,含まれていなけば空文字を返す。
ちょっと訊きたいんだけど,MPEG4のLCとHEの違いってSBRが適用されてるかいなかの差?
もしそうならまさにそのオプションがあって
mediainfo --Output='Audio;%Format_Settings_SBR%'
↑これは,SBRが含まれていれば“Yes (Explicit)”,含まれていなけば空文字を返す。
907デフォルトの名無しさん
2018/09/16(日) 00:17:30.07ID:6L484PJq >>904
> >>896の時点のコードは以下です
> https://pastebin.com/qdNT6iBm
つまらん。特に指摘する点はない。
細かい趣味程度のことぐらいだな。
ファイルは引数で渡したほうがいいんじゃね?とか
俺ならset -eu -o pipefailをつけるとか
(一行で書く場合を除いて)コマンドの後ろの ;; は嫌いだとか
> >>896の時点のコードは以下です
> https://pastebin.com/qdNT6iBm
つまらん。特に指摘する点はない。
細かい趣味程度のことぐらいだな。
ファイルは引数で渡したほうがいいんじゃね?とか
俺ならset -eu -o pipefailをつけるとか
(一行で書く場合を除いて)コマンドの後ろの ;; は嫌いだとか
908デフォルトの名無しさん
2018/09/16(日) 01:08:58.79ID:dyBKzwHe 大先生かよw
909デフォルトの名無しさん
2018/09/16(日) 01:22:39.05ID:6L484PJq ちーす
910デフォルトの名無しさん
2018/09/16(日) 13:43:22.79ID:dTju3huw ネタフリ、これ前に紹介したことあったっけ?
modernish: a shell moderniser library
https://github.com/modernish/modernishhttps://github.com/modernish/modernish#modernish-a-shell-moderniser-library
良さそうなことを書いてあるが、大きすぎて、それでいて何ができるのかよくわからない
ようするに誰か日本語で簡潔に解説してくれとw
modernish: a shell moderniser library
https://github.com/modernish/modernishhttps://github.com/modernish/modernish#modernish-a-shell-moderniser-library
良さそうなことを書いてあるが、大きすぎて、それでいて何ができるのかよくわからない
ようするに誰か日本語で簡潔に解説してくれとw
911デフォルトの名無しさん
2018/09/16(日) 21:03:29.36ID:ynEgKPZ+ 変な人が二人いるせいで質問者が帰っちゃったじゃん。せっかく良い案を思いついたのに。
912デフォルトの名無しさん
2018/09/16(日) 23:14:50.58ID:dTju3huw いや、気にせず書けよw
また見るかもしれないじゃん
また見るかもしれないじゃん
913デフォルトの名無しさん
2018/09/16(日) 23:27:44.88ID:ynEgKPZ+ もう書いてるよw
914デフォルトの名無しさん
2018/09/17(月) 09:30:58.79ID:yJ/mJYoq 二人いるんじゃなくて、同一人物なんじゃ?
例の人、プロバイダー2つ契約してて自演に使ってるんだし。
例の人、プロバイダー2つ契約してて自演に使ってるんだし。
915デフォルトの名無しさん
2018/09/19(水) 03:32:21.41ID:6Ke1Nn09 引用符を除去するいい方法ってないかな。
個人的には変数の仕様("abc"はabcとみなされる)とかを利用してエレガントに解決できるんじゃないかと思ってるんだけど うまくいかん。
いまのところsed -e 's/"\([^"]+\)"/\1'で問題はないけれど「\"」の形のエスケープに対応したりするのが面倒になってくるんだよね この形だと。
個人的には変数の仕様("abc"はabcとみなされる)とかを利用してエレガントに解決できるんじゃないかと思ってるんだけど うまくいかん。
いまのところsed -e 's/"\([^"]+\)"/\1'で問題はないけれど「\"」の形のエスケープに対応したりするのが面倒になってくるんだよね この形だと。
916デフォルトの名無しさん
2018/09/19(水) 04:43:37.82ID:ScWhkKn/ a='"aa\"a"'
eval echo "$a" とか eval "b=$a"
じゃだめ?
おまけ、最近のbashには以下のような変数展開が
増えているけど今回は関係なさそう
${parameter@A}
${parameter@E}
${parameter@P}
${parameter@Q}
eval echo "$a" とか eval "b=$a"
じゃだめ?
おまけ、最近のbashには以下のような変数展開が
増えているけど今回は関係なさそう
${parameter@A}
${parameter@E}
${parameter@P}
${parameter@Q}
917デフォルトの名無しさん
2018/09/19(水) 07:25:21.58ID:6Ke1Nn09918デフォルトの名無しさん
2018/09/19(水) 07:59:33.05ID:ScWhkKn/ >>917
さあね。「引用符を除去するいい方法」の正確な意味がよくわからないので
もしかして単に前後の引用符を除去するだけだった?
ならこれだけで行けるけど
a='"aa\"a"'
a=${a#\"}
a=${a%\"}
エレガントに解決っていうから、なんかもっと複雑な話かと思った
さあね。「引用符を除去するいい方法」の正確な意味がよくわからないので
もしかして単に前後の引用符を除去するだけだった?
ならこれだけで行けるけど
a='"aa\"a"'
a=${a#\"}
a=${a%\"}
エレガントに解決っていうから、なんかもっと複雑な話かと思った
919デフォルトの名無しさん
2018/09/19(水) 08:36:50.27ID:6Ke1Nn09 >>918
いや 別に文句を言ったつもりはない
先に挙げてもらった方法で解決してるし あれはすごくエレガントだと思う。
エレガントっていうのは数学畑の言葉のつもりで使った。
つまりまわりくどいやりかたではなく本質をつらぬいた方法。
今回は,
「シェルに対してトークンの区切りを示すための引用符をシェルに読み込ませることによって除去する」
という非常に直感的で素晴しい方法を学べた。
俺のやりかたはわざわざsedを使ってる点で,シェルが解釈するという本質から外れてしまっている。
いや 別に文句を言ったつもりはない
先に挙げてもらった方法で解決してるし あれはすごくエレガントだと思う。
エレガントっていうのは数学畑の言葉のつもりで使った。
つまりまわりくどいやりかたではなく本質をつらぬいた方法。
今回は,
「シェルに対してトークンの区切りを示すための引用符をシェルに読み込ませることによって除去する」
という非常に直感的で素晴しい方法を学べた。
俺のやりかたはわざわざsedを使ってる点で,シェルが解釈するという本質から外れてしまっている。
920デフォルトの名無しさん
2018/09/19(水) 08:38:35.76ID:6Ke1Nn09 ちなみにやりたかったことは単純に
VAR="value with space"
↑こういうことが書かれたファイルから
value with space
という語句を取り出すというもの。
$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -f 2 -d '=' | eval echo "$(cat)"
↑こういう感じ。
VAR="value with space"
↑こういうことが書かれたファイルから
value with space
という語句を取り出すというもの。
$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -f 2 -d '=' | eval echo "$(cat)"
↑こういう感じ。
921デフォルトの名無しさん
2018/09/19(水) 09:31:58.31ID:qXmDWFW/ $ cat /etc/os-release | grep '^PRETTY_NAME' | cut -d'"' -f2
というのはどうだろう
というのはどうだろう
922デフォルトの名無しさん
2018/09/19(水) 09:41:44.85ID:ScWhkKn/ >>919
単に文字列の途中にどういう意味かわからなかっただけだよ。
>「\"」の形のエスケープに対応したりするのが面倒
とか書いてあったから、何がしたいんだろうと
前後の""を取るだけなら>>918のやり方が最短で最速
>>920
> VAR="value with space"
> ↑こういうことが書かれたファイルから
> value with space
> という語句を取り出すというもの。
それだとまた話が変わってくるな
(. /etc/os-release; echo $PRETTY_NAME)
()でくくってるのは、単に変数のスコープをサブシェルに閉じ込めてるだけ
カレントシェルにばらまいていいなら()はいらない
シェル互換の文法としてみなせるファイルならこれでいけるよ
コードが入っていたら実行されるから、安全なファイルと断定できるものにしか使えないけど
単に文字列の途中にどういう意味かわからなかっただけだよ。
>「\"」の形のエスケープに対応したりするのが面倒
とか書いてあったから、何がしたいんだろうと
前後の""を取るだけなら>>918のやり方が最短で最速
>>920
> VAR="value with space"
> ↑こういうことが書かれたファイルから
> value with space
> という語句を取り出すというもの。
それだとまた話が変わってくるな
(. /etc/os-release; echo $PRETTY_NAME)
()でくくってるのは、単に変数のスコープをサブシェルに閉じ込めてるだけ
カレントシェルにばらまいていいなら()はいらない
シェル互換の文法としてみなせるファイルならこれでいけるよ
コードが入っていたら実行されるから、安全なファイルと断定できるものにしか使えないけど
923デフォルトの名無しさん
2018/09/19(水) 22:30:20.23ID:/Yn8C735 "a" → a
こういう変換は、CSV でも苦労してる。
" が偶数個なら良いけど、奇数個なら形式エラーにするとか
CSV は、様々なバグが考えられるから、TSV が良い
"a""b" → a""b
ただし、" " 内で、" を使う場合、"" と連続させる。
この場合も、奇数個なら形式エラーにするとか、ややこしい
こういう変換は、CSV でも苦労してる。
" が偶数個なら良いけど、奇数個なら形式エラーにするとか
CSV は、様々なバグが考えられるから、TSV が良い
"a""b" → a""b
ただし、" " 内で、" を使う場合、"" と連続させる。
この場合も、奇数個なら形式エラーにするとか、ややこしい
924デフォルトの名無しさん
2018/09/19(水) 22:42:07.01ID:ScWhkKn/ >>923
別々の言語で3回ぐらいCSVのパーサーを書いたことありますよ
ダブルクォートがない場合、あって改行が入ってる場合など
Excelの仕様に完全対応したCSVライブラリがその言語になかったので
Perlの変態正規表現レベルにまでなれば可能かもしれないですが、
そういうネスト構造のあるものは単純な正規表現では解決不可能な問題です。
別々の言語で3回ぐらいCSVのパーサーを書いたことありますよ
ダブルクォートがない場合、あって改行が入ってる場合など
Excelの仕様に完全対応したCSVライブラリがその言語になかったので
Perlの変態正規表現レベルにまでなれば可能かもしれないですが、
そういうネスト構造のあるものは単純な正規表現では解決不可能な問題です。
925デフォルトの名無しさん
2018/09/19(水) 22:46:07.55ID:xLP4ypV2 タブ区切りでも
当然ダブルクォートがいる
頭悪いこといってるわ。。。
当然ダブルクォートがいる
頭悪いこといってるわ。。。
926デフォルトの名無しさん
2018/09/20(木) 09:41:46.66ID:cMPVhU9i ダブルクォートを特別扱いするかどうは仕様によるのでは?
927デフォルトの名無しさん
2018/09/20(木) 10:46:25.87ID:jnBpqPJK CSVの仕様といったらRFC4180やろ
928デフォルトの名無しさん
2018/09/20(木) 12:24:25.01ID:rEtRtbV+ >>927
それって区切り文字がタブの場合も書かれてるの?
それって区切り文字がタブの場合も書かれてるの?
929デフォルトの名無しさん
2018/09/20(木) 12:57:43.85ID:ILleL3Gt それくらい読めよw
RFCにはないけど、MIMEタイプ定義してる
https://www.iana.org/assignments/media-types/text/tab-separated-values
によると、
Note that fields that contain tabs are not allowable in this encoding.
となっているし、たぶんEOLも含んじゃだめそうなので、ダブルクオートいらねえよ。
RFCにはないけど、MIMEタイプ定義してる
https://www.iana.org/assignments/media-types/text/tab-separated-values
によると、
Note that fields that contain tabs are not allowable in this encoding.
となっているし、たぶんEOLも含んじゃだめそうなので、ダブルクオートいらねえよ。
930デフォルトの名無しさん
2018/09/20(木) 20:07:29.45ID:v1EqyHAs まあいくらRFCで規定してもディファクトスタンダードのExcel読めるフォーマットでないと意味ないしな w
931デフォルトの名無しさん
2018/09/20(木) 20:41:14.92ID:jnBpqPJK >>930
RFC4180とExcelのCSVはほとんど同じ
違いはデータの中に改行が含まれてる場合
Excelデータの中の改行はLF。(一行の最後はCRLF)
RFC4180はデータの中の改行はCRLF(一行の最後は同じくCRLF)
これだけしか違いはないよ
RFC4180とExcelのCSVはほとんど同じ
違いはデータの中に改行が含まれてる場合
Excelデータの中の改行はLF。(一行の最後はCRLF)
RFC4180はデータの中の改行はCRLF(一行の最後は同じくCRLF)
これだけしか違いはないよ
932デフォルトの名無しさん
2018/09/20(木) 20:45:03.75ID:jnBpqPJK CSVもTSVデータとしてキーボードから入力可能な文字を
区切り記号としているわけで、なんで
RS (0x1e Record Separator) とか
US (0x1f Unit Separator) とかいう
便利な文字を使わなかったのか?って思うな
区切り記号としているわけで、なんで
RS (0x1e Record Separator) とか
US (0x1f Unit Separator) とかいう
便利な文字を使わなかったのか?って思うな
933デフォルトの名無しさん
2018/09/20(木) 21:32:37.16ID:zLqp8E23 頭悪いこといってるわ
そんなコードなキーボードからどうやって入力すんの
viならできるが
こんなアホが、vi使えるとは考えらればいしな
そんなコードなキーボードからどうやって入力すんの
viならできるが
こんなアホが、vi使えるとは考えらればいしな
934デフォルトの名無しさん
2018/09/20(木) 21:37:28.28ID:IHzBiPD0 いつまでトリップはずしてんねんお前
935デフォルトの名無しさん
2018/09/20(木) 21:38:06.55ID:MjJalB6Y >>931
ほとんど同じとか言うプログラマーは信用できない
ほとんど同じとか言うプログラマーは信用できない
936デフォルトの名無しさん
2018/09/20(木) 21:38:41.53ID:t6JihYkI そもそもCSVは数値の表のためのデータ形式だからね
937デフォルトの名無しさん
2018/09/20(木) 21:39:06.57ID:Rg0LfXUv ほとんど病気
938デフォルトの名無しさん
2018/09/20(木) 21:42:44.26ID:zLqp8E23 カンマのキーとタブのキーと改行のキーは
どのキーボードについてる
低学歴知恵遅れにはコレが分からない
どのキーボードについてる
低学歴知恵遅れにはコレが分からない
939デフォルトの名無しさん
2018/09/20(木) 21:51:32.09ID:jnBpqPJK >>933
CSVエディタを使えばいいだけでは?
CSVエディタを使えばいいだけでは?
940デフォルトの名無しさん
2018/09/20(木) 21:51:35.97ID:5pjY9bpj CSVネタで久しぶりにアノヒトが嬉々として現れたなってことかな?w
941デフォルトの名無しさん
2018/09/20(木) 21:53:59.48ID:jnBpqPJK つーかCSVファイルをテキストエディタなんかで閲覧、編集する人なんていないでしょう?
可能か不可能かで言えば、可能だけどバイナリエディタでテキスト編集するような感じで
効率が悪いから、みんなエクセルつかってCSVファイルの読み書きするんだけど
可能か不可能かで言えば、可能だけどバイナリエディタでテキスト編集するような感じで
効率が悪いから、みんなエクセルつかってCSVファイルの読み書きするんだけど
942デフォルトの名無しさん
2018/09/20(木) 22:13:21.07ID:8Bepevhe 国によっては、カンマとピリオドの意味が逆転してるのあるけど
そんな国でも割り切って、セパレータはカンマにしてるんだろか
小数点がカンマ、どーしてそうなったか興味あるが
そんな国でも割り切って、セパレータはカンマにしてるんだろか
小数点がカンマ、どーしてそうなったか興味あるが
943デフォルトの名無しさん
2018/09/20(木) 22:16:57.13ID:zLqp8E23 引用符でくくられてたらどんな記号でも問題起きないからな
textを普通のエディタで開いてなんのコードが混入してるか分からないほうが
普通の感覚でイヤだから
低学歴知恵遅れなら細かいことは気にしないかもしれない
textを普通のエディタで開いてなんのコードが混入してるか分からないほうが
普通の感覚でイヤだから
低学歴知恵遅れなら細かいことは気にしないかもしれない
944デフォルトの名無しさん
2018/09/20(木) 22:18:05.52ID:MjJalB6Y >>941
編集はExcelだけど差分が容易に取れるからバージョン管理の為にcsvしてる
編集はExcelだけど差分が容易に取れるからバージョン管理の為にcsvしてる
945デフォルトの名無しさん
2018/09/20(木) 22:24:15.47ID:zLqp8E23 たとえばhttpもsmtpもコンテンツ以外は
crlfを除いて普通にぜんぶ0x20以上0x7e以下のテキストでやりとりしてるからな
低学歴知恵遅れなら、自分はそんなの意識しないUA使ってるからなんでもいいというワケ
crlfを除いて普通にぜんぶ0x20以上0x7e以下のテキストでやりとりしてるからな
低学歴知恵遅れなら、自分はそんなの意識しないUA使ってるからなんでもいいというワケ
946デフォルトの名無しさん
2018/09/20(木) 22:28:11.99ID:zLqp8E23 低学歴知恵遅れは
まずcsvがデータ交換用のフォーマットであることが分かってない
まずcsvがデータ交換用のフォーマットであることが分かってない
947デフォルトの名無しさん
2018/09/20(木) 22:33:55.28ID:8pZm26YJ >>925
半角また間違えたんか。何度目だよ
半角また間違えたんか。何度目だよ
948デフォルトの名無しさん
2018/09/20(木) 22:39:27.57ID:zLqp8E23 デファクトスタンダードのエクセルで
タブ区切りで保存すると
ふつうにこうやって保存されるからな
aho<HT>"boo""foo"<HT>baka
aho<HT>"boo""foo"<HT>baka
タブ区切りで保存すると
ふつうにこうやって保存されるからな
aho<HT>"boo""foo"<HT>baka
aho<HT>"boo""foo"<HT>baka
949デフォルトの名無しさん
2018/09/20(木) 23:21:58.71ID:fVTsYrUH >>948
そうだね そうだね
そうだね そうだね
950デフォルトの名無しさん
2018/09/21(金) 00:46:25.95ID:m8DL5ZJ4 >>931
TSV にして、データ中に、タブ・改行を使わないのが良さそう
>Excelデータの中の改行はLF。(一行の最後はCRLF)
Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ
TSV にして、データ中に、タブ・改行を使わないのが良さそう
>Excelデータの中の改行はLF。(一行の最後はCRLF)
Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ
951デフォルトの名無しさん
2018/09/21(金) 01:24:23.69ID:i9i22CNp Excelで直接開くと勝手にフォーマット変換されるのが気に入らないからテキストエディタで開いてからExcelにコピーとかやってるわ
952デフォルトの名無しさん
2018/09/21(金) 02:43:02.52ID:v8LFlyn0953デフォルトの名無しさん
2018/09/21(金) 02:43:36.28ID:v8LFlyn0954デフォルトの名無しさん
2018/09/21(金) 04:04:34.44ID:m7KC0L1Z >>951
拡張子を txt にしてから開いてウィザード動かすか、または 0 で始まる数字だけの文字列は ="0123" のようにして最初から作っておくとうまく行く。
拡張子を txt にしてから開いてウィザード動かすか、または 0 で始まる数字だけの文字列は ="0123" のようにして最初から作っておくとうまく行く。
955デフォルトの名無しさん
2018/09/21(金) 04:48:00.63ID:dtC8HZuo ちょっと荒れたのであまり話題にはしたくないものの
Unicodeの区切り文字を使うのはいい手段だと思う。
ただし思い切り独自規格なので既存の製品には対応できないけどね。もちろん
Unicodeの区切り文字を使うのはいい手段だと思う。
ただし思い切り独自規格なので既存の製品には対応できないけどね。もちろん
956デフォルトの名無しさん
2018/09/21(金) 05:30:02.46ID:v8LFlyn0 RS、USってのはUnicodeじゃなくてASCIIの制御文字だよ
957デフォルトの名無しさん
2018/09/21(金) 05:37:53.78ID:v8LFlyn0 もちろんUnicodeでも使えるけどね
958デフォルトの名無しさん
2018/09/21(金) 06:06:23.57ID:v8LFlyn0 一般人はCSVファイルをExcelで編集する
となると別にテキスト形式ベースじゃなくても良いわけだ
だとすると誰がCSVファイルを望んでいるのだろうか?
おそらくプログラマなんだろうね。
考えてみればテーブル型データに限っていれば
CSVはJSONよりも効率よくデータを記述できる
JSONだったらこんな感じだしね
[
{"field1": 1, "field2": 2, "field3": 3},
{"field1": 1, "field2": 2, "field3": 3},
]
これがCSVだとここまでコンパクトに纏められる
field1,field2,field3
1,2,3
1,2,3
一般人のことを考えないくていいという前提のものと、もっと良い形式が考えてみよう
それもシェルスクリプトで扱うのが容易な形式
一行ずつ読み取るのだから、一データの終わりはLFであるべきだろう
そしてデータの中には改行は含まず、カンマや制御コードはprintfコマンドで
簡単に解釈ができるよう8進数にエスケープを行う。どうかね?
エスケープの処理を除けば既存のツールでも扱えるだろう
ただ問題があるとすれば、printfで変数に代入する時forkを行う必要があるということだな
これだと時間がかかってしまう。かといって1文字ずつパースするのも時間がかかる
一行ずつ処理するのが可能で、1カラムずつ処理するのも可能で処理に時間がかからない方法はないだろうか
となると別にテキスト形式ベースじゃなくても良いわけだ
だとすると誰がCSVファイルを望んでいるのだろうか?
おそらくプログラマなんだろうね。
考えてみればテーブル型データに限っていれば
CSVはJSONよりも効率よくデータを記述できる
JSONだったらこんな感じだしね
[
{"field1": 1, "field2": 2, "field3": 3},
{"field1": 1, "field2": 2, "field3": 3},
]
これがCSVだとここまでコンパクトに纏められる
field1,field2,field3
1,2,3
1,2,3
一般人のことを考えないくていいという前提のものと、もっと良い形式が考えてみよう
それもシェルスクリプトで扱うのが容易な形式
一行ずつ読み取るのだから、一データの終わりはLFであるべきだろう
そしてデータの中には改行は含まず、カンマや制御コードはprintfコマンドで
簡単に解釈ができるよう8進数にエスケープを行う。どうかね?
エスケープの処理を除けば既存のツールでも扱えるだろう
ただ問題があるとすれば、printfで変数に代入する時forkを行う必要があるということだな
これだと時間がかかってしまう。かといって1文字ずつパースするのも時間がかかる
一行ずつ処理するのが可能で、1カラムずつ処理するのも可能で処理に時間がかからない方法はないだろうか
959950
2018/09/21(金) 07:09:48.97ID:m8DL5ZJ4 >>931
>Excelデータの中の改行はLF。(一行の最後はCRLF)
もし、このCSV を、Linux で扱う場合には、やばくない?
行区切りをCRLF に設定すれば、データ中に、LF があっても問題ないのかな?
>Excelデータの中の改行はLF。(一行の最後はCRLF)
もし、このCSV を、Linux で扱う場合には、やばくない?
行区切りをCRLF に設定すれば、データ中に、LF があっても問題ないのかな?
960デフォルトの名無しさん
2018/09/21(金) 08:12:42.97ID:LR4lwFnG961デフォルトの名無しさん
2018/09/21(金) 09:34:09.19ID:7bTZc31z >>958
fork?どういう処理を想定してるのか?
fork?どういう処理を想定してるのか?
962デフォルトの名無しさん
2018/09/21(金) 09:47:27.07ID:NXw3/PDJ みんなで輪になって踊る処理やろ
963デフォルトの名無しさん
2018/09/21(金) 09:56:30.62ID:7bTZc31z 【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
964デフォルトの名無しさん
2018/09/21(金) 10:10:07.17ID:v8LFlyn0965デフォルトの名無しさん
2018/09/21(金) 10:49:46.73ID:v8LFlyn0 なんか次から次へと変なテクニックが編み出されていくw
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 事実上の減反政策を法定化へ 農水省方針 「需要に応じた生産」推進 [蚤の市★]
- 【鰻】ニホンウナギの規制強化案、ワシントン条約会議で正式に否決 [ぐれ★]
- 【独占直撃】「国分太一と縁は切れない」電動ママチャリで疾走する元TOKIOリーダー城島茂、ついに明かした31年間と沈黙の「本音」 [Ailuropoda melanoleuca★]
- フジテレビ F1地上波放送11年ぶり復活へ 26年シーズンから最大5戦 [征夷大将軍★]
- 【高知】小学校の教員採用、合格者の約6割が辞退 高知県教委、追加選考へ [七波羅探題★]
- 「超富裕層」への追加課税の対象拡大、現行の所得30億円の引き下げで調整 -1億円の壁」是正狙い [蚤の市★]
- 日本人「AIで失業?ないない(笑)日本人を舐めるな😡」 AIに対する楽観姿勢、先進国で異例。 [271912485]
- 32歳で係長って優秀?
- 面倒くさくてぶち切れる
- 【悲報】所得税増税、2027年1月からWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 告白
- 仕事って退屈だよな
