19/07/18 21:52:45.54 DPDlMznj.net
trapはイベントハンドラじゃない。
シグナルに対してイベントハンドラを設定するもの
引き数渡したり戻り値受け取ったり出来ないのは
trapの制限であってイベントハンドラの制限じゃない
333:デフォルトの名無しさん
19/07/18 22:00:05.94 ugDCzjFC.net
言いたいのはクロージャの話してるのにtrap 持ってくるのは筋違いってことだ
334:デフォルトの名無しさん
19/07/18 22:03:45.58 DPDlMznj.net
別に筋違いでもない。戻り値は(標準)出力と上で書いたが、
trapで出力したものは画面に表示される。
335:デフォルトの名無しさん
19/07/18 23:59:39.80 SGv/emwF.net
「mapは意外と使い道がない!lisp以外では意外と実装されていない!!(キリッ」
336:デフォルトの名無しさん
19/07/19 01:30:43.88 /UdqfCLD.net
正直>>321のmapの話は無知だなと思ったけど(めちゃめちゃ実装言語があるので)
そうやって煽ることしかできない君より100万倍有意義な発言だったよ。
337:デフォルトの名無しさん
19/07/19 01:49:27.68 7Hdy7m6i.net
>>323
Kotlin もよろしく
338:デフォルトの名無しさん
19/07/19 02:44:48.56 ApXEphk2.net
map 縛ると高階関数で書きにくい
339:デフォルトの名無しさん
19/07/19 08:55:46.76 MqWaI42B.net
>>329
本人乙。
勉強になったなw
次からはあんま調子乗らないよう気を付けろよ?ww
340:デフォルトの名無しさん
19/07/19 09:10:54.61 mIHotaYe.net
第13話 本物のラムダ計算(完)
341:デフォルトの名無しさん
19/07/19 10:16:54.74 uab/wKdg.net
Cだとqsort()とかがラムダになるのかな。
342:デフォルトの名無しさん
19/07/19 10:47:40.54 pw5qcQRZ.net
map が有効な例はどんな時?
343:デフォルトの名無しさん
19/07/19 11:16:36.30 ApXEphk2.net
集合XからYに写像を持つ関数fがあれば
Y = f(X) と
344:書ける これを満たす x, yは y = f(x) で表わせる 数学だとこんなかんじだが プログラムなら Y = map f X のような感じでいっきに変換できる map 使わないで、古典的なループを書くと for my $x (@X) {push @Y, &f(x)} のような具合になるが、x, push など本来不要な変数や操作を中継するため コードが肥大化する
345:デフォルトの名無しさん
19/07/19 11:33:07.63 /UdqfCLD.net
>>332
いや俺>>321じゃないけど…w
346:デフォルトの名無しさん
19/07/19 11:37:49.93 /UdqfCLD.net
>>336
Y = f(X)って書き方は数学ではあんましねーな。
f: X → Yという風に書く。
ラムダ計算は
f: x ∈ X ↦ y ∈ Yに対して
(λ x ∈ X. y ∈ Y)のことを言う。
↑こうすると
f(x) = yっていう「普通の」関数適用が
(λ x. y)(x) = y
というように「f」という新規記号を用いずに表せる。
ここから>>336の後半に続く。
347:デフォルトの名無しさん
19/07/19 11:47:33.02 /UdqfCLD.net
>>316
たしかにそう言われるとシェルスクリプトのほうが
短かいっちゃ短かいな。
変数名が固定されることが有利に働くとは。
348:デフォルトの名無しさん
19/07/19 12:35:59.70 mIHotaYe.net
>>339
perlのsortの場合、$a、$b固定になってる
URLリンク(perldoc.jp)
my @articles = sort {$a cmp $b} @files;
perlの場合、関数の引数は$_[0]、$_[1]で取れるのだが
そうすると、sortの外の$_[0]、$_[1]になってしまう。
文字列にしてevalしちゃえば同じことはできると思うがそれでも長くなっちゃうしな。
my @articles = sort '$_[0] cmp$_[1]' @files;
このために$a、$bをグローバル変数としているようだが、Perlはダイナミックスコープを
使えるからローカル変数にできるんじゃないかな? 互換性のためにそうなっているのかも
349:デフォルトの名無しさん
19/07/19 14:53:58.91 pw5qcQRZ.net
>>336
一気に変換できるとありがたい例が
具体的に思いつかないのですか
350:デフォルトの名無しさん
19/07/19 15:35:22.89 uab/wKdg.net
>>341
有り難いと言うか、記述が短くなったり、余計な変数を使わなくてよくなったり、連結して書けて分かりやすくなったりという利点があるかな。
351:デフォルトの名無しさん
19/07/19 15:43:06.00 ApXEphk2.net
>>341
集合を扱うのに適した型がない言語、perl などを例にすると
後ろの方を見るのに時間がかかる大きなリスト素早く参照するハックとして
>271
のようにハッシュに打ちこむ手法がある
シェルスクリプトのワンライナーだと1行ずつ入ってくるけど
perl コード内なら簡潔に書けるし、たぶん map の部分が C で書かれてて
速度が出ることが覆い
このタイプの高速な手法としてはシュワルツ変換が有名
|sort -k 2,2
に相当するやつ
352:デフォルトの名無しさん
19/07/19 16:04:19.10 S0JoFjeS.net
>>340
心配しなくてもその $a と $b はダイナミックスコープなローカル変数だよ。
レキシカルスコープでなければローカル変数じゃないという意見もあろうが。
353:デフォルトの名無しさん
19/07/19 17:47:07.68 mIHotaYe.net
>>344
リンク先にはグローバルって書いてある。
下の方にごちゃごちゃ書いてあるけど、ちょっと今読みたくないやw
354:デフォルトの名無しさん
19/07/19 19:32:30.99 LTHpRmEj.net
ていうかシェルスクリプトの関数って(少なくともPOSIXの範囲では)広域定義で
システムのコマンドと同じ名前空間(名前空間なんて一つしかないけど)で定義するしかない。
だからラムダ式に代表される無名関数は寧ろシェルスクリプトのような言語で重宝するかも知れない。
でも可読性や保守性を考えると一般的でない書き方なので多用は控えたほうがいいかな。
355:デフォルトの名無しさん
19/07/20 02:10:15.33 RMeQOh+3.net
>>345
もちろんそのリンク先に書いてある。……下から 21 行目に。(空行を除く)
356:デフォルトの名無しさん
19/07/23 15:21:00.97 vatz3/hX.net
シェルスクリプトで引数が整数であることを判定する可搬で高速な方法ってなんだろう
思い付いたのは
isint() {
case "$1" in
[0-9][0-9]*) printf '%d\n' $1 ;;
*) return 22 ;;
esac
}
…ところで$1がないときは標準入力から値を取得するっていう操作ってどう実装するんだろう?
357:デフォルトの名無しさん
19/07/23 15:29:05.59 +7TCISw6.net
>>348
標準入力かどうかは
けっこうシェルスクリプトとperlは同じような書き方する部分があるから
こんな構文がありそうだ
URLリンク(pastebin.com)
あとそれだと負の数が抜けてる。数字の前に マイナス記号がついている可能性がある
358:デフォルトの名無しさん
19/07/23 15:31:44.56 ecacfG7E.net
case $1 in # $1にダブルクォートはいらない
*[!0-9]* ) ;; # 数字以外が含まれている = 整数ではない
*) ;; # それ以外 = 整数である
esac
if [ $# -eq 0 ]; then
read -r data
else
data=$1
fi
とかいろいろ
359:デフォルトの名無しさん
19/07/23 15:32:56.13 ecacfG7E.net
> 数字の前に マイナス記号がついている可能性がある
case ${1#-} in
こうすればよい
360:デフォルトの名無しさん
19/07/23 15:36:47.54 ecacfG7E.net
$1があるかどうかじゃなくて、echoなどで流し込まれているかどうかなら
if [ -t 0 ]; then
# 流し込まれてなどいない
else
# 流し込まれている
fi
361:デフォルトの名無しさん
19/07/23 15:43:42.61 ecacfG7E.net
所でcaseって戻り値を返すって知ってる?
isint() {
case $1 in
*[!0-9]* ) false ;;
*) true ;;
esac
}
if isint 1; then
echo int
fi
とか、
if case $1 in *[!0-9]* ) false ;; *) true ;; esac; then
echo int
fi
とか
if ! case $1 in *[!0-9]* ) false; esac; then
echo int
fi
とか書けるよ
362:デフォルトの名無しさん
19/07/23 15:47:46.96 ecacfG7E.net
> if ! case $1 in *[!0-9]* ) false; esac; then
間違えたw !いらない
最短かな?
if case $1 in *[!0-9]*) false; esac; then
echo int
fi
ワンライナーw
isint() { case $1 in *[!0-9]*) false; esac; }
363:デフォルトの名無しさん
19/07/23 15:50:04.40 ecacfG7E.net
あ、空文字のときにintになるね。こうすればよい
isint() { case $1 in ''|*[!0-9]*) false; esac; }
364:デフォルトの名無しさん
19/07/23 15:50:25.78 h7ECSrMt.net
expr "$1" + 0 >/dev/null 2>&1
echo $?
というのもありかと思ったけど、MAXINT(2^32or2^64)以上になると
エラーになる(exit status 3)からダメか
365:348
19/07/23 16:11:28.72 vatz3/hX.net
みなさんありがとうございます。
↓助言を参考にさしてもらってこういう形にしました。
isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22 ;;
*) true ;;
esac
}
「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
実現が難しそうなので諦めます。
366:デフォルトの名無しさん
19/07/23 16:12:19.43 ecacfG7E.net
if case $1 in *[!0-9]*) false; esac; then
echo int
fi
こっちのほうが短いかw
case $1 in *[!0-9]*) :;; *)
echo int
esac
367:348
19/07/23 16:15:37.53 vatz3/hX.net
……と思いましたが良い感じの構文を思い付きました。
isint() { set -- "${1:-"$(cat)"}"
case ${1#-} in
''|*[!0-9]*) return 22 ;;
*) true ;;
esac
}
これでどうでしょうかね。もし$1が設定されていなければcat(1)が実行されて
cat(1)には引数が渡っていない(この時は$1が設定されていない)ので
If no file operands are specified, the standard input shall be used.
(URLリンク(pubs.opengroup.org))
に従って標準入力が読み込まれてset -- 〈標準入力の内容〉となって$1に標準入力が設定される。
368:デフォルトの名無しさん
19/07/23 16:15:43.02 ecacfG7E.net
trueはさっき俺が書いたけど、別にいらない
isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22
esac
}
> 「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
こっちも書いたはずだが? cat "$1" or cat "/dev/stdin" の話でもしてたのか?
369:デフォルトの名無しさん
19/07/23 16:16:28.44 ecacfG7E.net
cat呼び出しは遅いから、read使ったんだが?
370:デフォルトの名無しさん
19/07/23 17:17:45.59 vatz3/hX.net
>>361
申し訳ないです。完全に見落してました。
371:デフォルトの名無しさん
19/07/23 23:34:58.45 JEktaXSk.net
npmでシェルスクリプトだけのパッケージを配布してもOKですか?
372:デフォルトの名無しさん
19/07/24 01:15:44.75 ArGZw8p9.net
npmスレに。
373:デフォルトの名無しさん
19/07/24 21:22:10.25 ArGZw8p9.net
>>361
catとreadってたった一行読み込むのにそんな差ある?
374:デフォルトの名無しさん
19/07/25 02:49:23.09 WafvXnG3.net
1行だからcatが遅いんだろ
375:デフォルトの名無しさん
19/07/25 02:51:27.80 muDuQw8n.net
ついcatなって言った
376:デフォルトの名無しさん
19/07/25 08:46:34.39 m8sWcejF.net
こawkあいはしていない。
377:デフォルトの名無しさん
19/07/25 14:59:51.08 VsjL1nxe.net
sedで質問です。
置換前
(a0b1c2=99999) (a0b1c2=00000)
置換後
DATA1=99999 DATA2=00000
こんな感じに置換したいです。
カッコと接頭辞みたいなのを除去した上で、
行の1つめはDATA1に、2つめはDATA2に置換したいという意味です。
何卒ご教示ください。
378:デフォルトの名無しさん
19/07/25 15:04:52.21 D8pzUtDE.net
(
[a-zA-Z0-9]
=
[0-9]+
)
こんな形のデータか?
379:デフォルトの名無しさん
19/07/25 15:09:40.46 D8pzUtDE.net
暫定これ
echo "(a0b1c2=99999) (a0b1c2=00000)" | sed -n 's/([a-zA-Z0-9]\+=\([0-9]\+\)) ([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
DATA1=99999 DATA2=00000
380:デフォルトの名無しさん
19/07/25 15:11:16.41 VsjL1nxe.net
>>370
すいません、話を簡単にするため>>369は端折ったんですが、
端折らない方がよさそうなので元データそのまま書きます。
わかる人にはわかるかもしれませんが、VMwareのAPIから取ってきた値です。
guest(01) %!s(int32=110) %!s(int32=3625)
これは左からゲスト名、各ゲストのCPU使用量(MHz)、メモリ使用量(MB)です。
これを
guest(01) CPU=110 Memory=3625
こんな感じにしたいなと思っています。
最初はsedの単純な置換とパイプで何とかしようとしたんですが、
ゲスト名にもカッコが使われてる(のが除去されちゃう)という部分が回避できませんでした。
381:デフォルトの名無しさん
19/07/25 15:20:38.81 D8pzUtDE.net
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -n 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
guest(01) DATA1=110 DATA2=3625
これで間にあう?
382:デフォルトの名無しさん
19/07/25 15:22:34.93 D8pzUtDE.net
失礼しました
最後のCPU, Memoryに書きかえて
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -e 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/CPU=\1 Memory=\2/g'
guest(01) CPU=110 Memory=3625
383:デフォルトの名無しさん
19/07/25 15:27:23.74 hsvk8oNq.net
>>361
パイプにテキストファイルの中身を流し込んで逐次処理するとき、
cat "hoge.txt" | ~ のほかに、
echo $(< "hoge.txt") | ~ とか、
lessなどのページャー読み込みでもできるけど、
どうするかいつも悩むなぁ。
grepなどの、ファイル読み込みオプションのあるコマンドが先頭ならそれを使えばいいけど、
そうでない場合は、みんなどうしてる?
384:デフォルトの名無しさん
19/07/25 15:44:25.16 qx5YGZv4.net
>>375
何故 < hoge.txt じゃ駄目なの?
385:デフォルトの名無しさん
19/07/25 15:57:19.67 VsjL1nxe.net
>>374
できました!ありがとうございます!
高度すぎて何やってるのかさっぱり理解できてませんが、
じっくり解読させていただきます。
386:デフォルトの名無しさん
19/07/25 17:02:25.09 hsvk8oNq.net
>>376
複数のパイプを繋げた逐次処理の場合に、
処理元のファイルが何であるかを明確にしたいので、
すべてのパイプの先頭に持っていきたいんだよ。
ファイル読み込み | 処理1 | 処理2 | 処理3…
387:デフォルトの名無しさん
19/07/25 17:18:56.17 vvE0ECJG.net
俺なら
< hoge.txt cmd1 | cmd2
388: | cmd3 ... と書く
389:デフォルトの名無しさん
19/07/25 17:34:33.11 hsvk8oNq.net
>>379
ほぉ、リダイレクトって、コマンドの前にもってこれるんだ。ありがとう。
これならとりあえず、ソースを明確にできるね。
しかもおそらく一番処理が速いかな。
catを使った方法のような、単に読み込むだけのコマンドの高速版みたいなのはないのかなぁ。
390:デフォルトの名無しさん
19/07/25 18:20:54.41 D8pzUtDE.net
>>377
正規表現は実行可能な回戦ノイズになりやすいから、
複雑なものは、可能なら perl を薦める
バックスラッシュの頻度も下がり、空白で単位ごとに分けられ読みやすい
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe 's{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) \N{SPACE} \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) }{CPU=$1 Memory=$2}xg'
guest(01) CPU=110 Memory=3625
sedの正規表現にはいくつか注意すべきことがあると思う
match部の
( が 文字どおりの ( にマッチする
\( が あとで \1 \2 で使う為のキャプチャの括弧になる。
\+ が1つ以上の という個数指定になる
391:デフォルトの名無しさん
19/07/25 18:41:30.57 m8sWcejF.net
……Perlも十分読み難いと思うのは俺だけだろうか…
392:デフォルトの名無しさん
19/07/25 18:52:29.83 I5POGkj3.net
perl が使えるような環境なら sed -E 使えるんじゃね?
393:デフォルトの名無しさん
19/07/25 19:47:46.86 D8pzUtDE.net
>>382
もっと分かりやすそうに書いてみた
今度はどうだ?
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe ' $pattern = q{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) } ; s/$pattern \N{SPACE} $pattern/CPU=$1 Memory=$2/x'
guest(01) CPU=110 Memory=3625
394:デフォルトの名無しさん
19/07/25 21:09:49.52 AjtfUs9C.net
>>384
$pattern への値の代入は一回で良いので BEGIN { ... } の中に入れた方が効率が良くなる。
(勝手に最適化されて最終的には大差なくなってしまうかも知れないけどね)。
395:デフォルトの名無しさん
19/07/25 22:22:57.77 1GqrqsZl.net
これぐらいのの複雑さになると、perl でちゃんと改行、インデントして
書いた方がいいような気がする
396:デフォルトの名無しさん
19/07/26 00:44:50.95 16gdYth6.net
シェルスクリプトは関数型だとかアホなこと言ってるブログがあった
397:デフォルトの名無しさん
19/07/26 10:46:37.80 54Ib42km.net
Ruby では、
def get_value( str ) # = ) の間にある文字列を取得する
pos_1 = str.rindex "=" # 文字を末尾から探す
pos_2 = str.rindex ")"
str[ pos_1 + 1 ... pos_2 ]
end
str = 'guest(01) %!s(int32=110) %!s(int32=3625)'
ary = str.split # 空白で区切る
# ["guest(01)", "%!s(int32=110)", "%!s(int32=3625)"]
puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"
# guest(01) CPU=110 Memory=3625
1-liner では、
ただし、途中で改行したので、1行にしてください!
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | ruby -ne 'def get_value( str ) pos_1 = str.rindex "="; pos_2 = str.rindex ")"; str[ pos_1 + 1 ... pos_2 ] end;
ary = $_.split; puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"'
398:デフォルトの名無しさん
19/07/26 12:22:34.47 AGnOcgvd.net
>>388
死ね
399:デフォルトの名無しさん
19/07/27 10:41:07.02 6v++aFZ1.net
上の方の数値判定だけどマイナス記号を考えない(つまり正整数だけを判定する)のなら
[ ! ${var%%[0-9]*} ]
これが最速で(記述も)最短じゃなかろうか。
400:デフォルトの名無しさん
19/07/27 11:54:57.07 z4Poa3yK.net
真っ直ぐに一直線ですか?
401:デフォルトの名無しさん
19/07/27 13:52:23.75 QzyB/IP7.net
>>390
シェルのパターンマッチングでの '*' って any string の意味なので、
$ var='10abcdefg'
$ [ ! ${var%%[0-9]*} ] && echo integer
integer
となってしまう。bash の extglob を使うなら、
$ [ ! ${var%%?([-+])+([0-9])} ] && echo integer
などと書ける(空文字の場合に対応してないけど)。
402:デフォルトの名無しさん
19/07/27 15:15:37.83 6v++aFZ1.net
>>392
おうマジだ。
なぜか英字のみと数字のみの変数で試してたから気付かなかったw
恥かしすぎるw
403:デフォルトの名無しさん
19/07/27 19:04:12.75 6v++aFZ1.net
突飛なことはせずcase分使うのが一番いいのかな。
正直、俺だったらそもそも「型」の概念が必要になるようなプログラムは
シェルスクリプトで書かないけど
404:デフォルトの名無しさん
19/07/28 00:29:26.94 LPR+u+AV.net
* は、シェルスクリプトでは、0文字以上の任意の文字列で、
正規表現では、直前の文字の0回以上の繰り返し
正規表現を使うのなら、egrep, grep -e でフィルターしないといけない
egrep '正規表現'
これもシェルで解釈されないように、シングルクォーテーションで囲む方がよい
405:デフォルトの名無しさん
19/07/28 00:33:37.21 7n7RswoS.net
perlは正規表現しか知らんが構文は結構読みにくいのね
pythonやruby辺りやった方がいいのかな
簡単なシェルスクリプトを書いたりsedやawkで弄ったりはしてるけど
406:デフォルトの名無しさん
19/07/28 01:42:13.12 /N9EqgUo.net
シェルスクリプトとしてはワンライナーが短く書け、
カオスも含めた無限のような表現力のあるperl を薦める
seq 30 | perl -0777 -ne 'print $_ =()= /1/g'
13
407:デフォルトの名無しさん
19/07/28 02:18:58.47 UCGA8APU.net
seq 30 | tr -dc '1' | wc -c
でいいんじゃね
408:デフォルトの名無しさん
19/07/28 02:37:29.23 /N9EqgUo.net
旨い
2文字以上じゃないことを利用する柔軟性見事
409:デフォルトの名無しさん
19/07/28 03:11:34.56 vKAr7iFy.net
>>397
>>398
この二つって1から30までの間に何回1が登場するかを数えてるの?
410:デフォルトの名無しさん
19/07/28 04:13:22.82 /N9EqgUo.net
はい
411:デフォルトの名無しさん
19/07/28 04:28:55.80 LPR+u+AV.net
Ruby では、1 の個数を数える
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
412:デフォルトの名無しさん
19/07/28 04:30:02.41 vKAr7iFy.net
何の意味があんの?
Perlだと複雑に書けるよってこと?
413:デフォルトの名無しさん
19/07/28 04:37:14.85 UCGA8APU.net
1 を数えたいなら
$ seq 30 | grep -o 1 | wc -l
414:デフォルトの名無しさん
19/07/28 10:48:09.20 /N9EqgUo.net
きっと見たこともない構文だと思って書いた
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
415:デフォルトの名無しさん
19/07/28 11:51:54.16 V62sQMom.net
改行を無視して検索は?
416:デフォルトの名無しさん
19/07/28 12:45:34.52 /N9EqgUo.net
3行以上にまたがる複数行?
2行まで?
417:デフォルトの名無しさん
19/07/29 21:57:36.07 LpaqQy0x.net
PowerShell では、
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
418:デフォルトの名無しさん
19/07/30 00:35:05.01 TDafWW+v.net
PowerShellって嫌われてるけど結構便利だよね。
でも使い熟せる自信も気力もないw
419:デフォルトの名無しさん
19/07/30 07:02:14.50 lWAzz/KK.net
PowerShellってどういう場面で使われるの?
Bash使わないでPowerShell使うことってあんの?
420:デフォルトの名無しさん
19/07/30 07:18:22.77 RYwsY7rK.net
windows update からの shutdown
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
421:デフォルトの名無しさん
19/07/30 07:51:48.49 TDafWW+v.net
喩えが文学的すぎて分からん
422:デフォルトの名無しさん
19/07/30 18:08:45.58 EUusSyFO.net
URLリンク(pubs.opengroup.org)
doshってなに?
423:デフォルトの名無しさん
19/07/30 18:16:09.63 fdfPnQnm.net
Remove-Item、Copy-Itemとか生理的に受け付けない体になってる。
424:デフォルトの名無しさん
19/07/30 18:28:39.62 R+5nd6EU.net
>>413
DOcker SHell
425:デフォルトの名無しさん
19/07/30 18:34:09.08 EUusSyFO.net
時代からしてそれはないだろ
426:デフォルトの名無しさん
19/07/30 19:37:33.76 6/Ph+fdB.net
>>408
オシャレだ
427:デフォルトの名無しさん
19/07/30 20:50:28.04 TDafWW+v.net
>>413
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
URLリンク(schilytools.sourceforge.net)
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
428:418
19/07/30 20:57:36.54 TDafWW+v.net
URLリンク(unix.stackexchange.com)
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
URLリンク(docs.oracle.com)
にはその記述が見当らず……。どゆこと???
429:デフォルトの名無しさん
19/07/30 21:12:05.50 EUusSyFO.net
>>418
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
URLリンク(pubs.opengroup.org)
430:デフォルトの名無しさん
19/07/30 21:15:06.53 EUusSyFO.net
ここには元ネタはUNOSとか書いてあるね。
URLリンク(unix.stackexchange.com)
This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
431:デフォルトの名無しさん
19/07/30 21:19:41.35 EUusSyFO.net
URLリンク(www.in-ulm.de)
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
432:デフォルトの名無しさん
19/07/30 21:26:48.89 EUusSyFO.net
URLリンク(unix.stackexchange.com)
If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily
このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
433:デフォルトの名無しさん
19/07/30 21:30:36.00 TDafWW+v.net
>>423
この回答者>>419じゃない?
そうだとしたら確実にOpenSolarisのシェルに携わってる人。
434:デフォルトの名無しさん
19/07/30 21:57:06.40 EUusSyFO.net
「OpenSolarisのシェルに携わってる」はちょっと疑問かな
URLリンク(schilytools.sourceforge.net)
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.
と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする
Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能
> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:
として、自身が昔仕事で関わっていたUNOS
URLリンク(unix.stackexchange.com)
> First paid UNIX related work with UNOS in 1982.
で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。
Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
435:デフォルトの名無しさん
19/07/30 22:00:29.38 TDafWW+v.net
>>425
ははーん。そういうことか。
Solaris Bシェルが持ってた拡張機能じゃなくてSolaris Bシェルに対する拡張機能だった訳ね。
Solarisの手引書を漁っても見付からない訳だ。
436:デフォルトの名無しさん
19/07/30 22:35:47.42 TDafWW+v.net
全然関係ないけど
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
437:デフォルトの名無しさん
19/07/30 22:45:31.33 TDafWW+v.net
参考: URLリンク(austingroupbugs.net)
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
438:デフォルトの名無しさん
19/07/31 12:01:53.51 6BPSvdm1.net
>>414
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている
gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir
gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi
gal -name ls
# ls -> Get-ChildItem
gal -name echo
# echo -> Write-Output
439:デフォルトの名無しさん
19/07/31 16:37:25.52 kGX3Rh8Y.net
>>429
それ日本語が出てるの?
それとも日本語はあなたが付け足したの?
440:デフォルトの名無しさん
19/07/31 22:49:22.63 FZL3ewwl.net
>>412
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
441:デフォルトの名無しさん
19/07/31 23:18:58.96 kGX3Rh8Y.net
boshがビルドできずに諦めたw
442:デフォルトの名無しさん
19/07/31 23:25:31.28 8xUIRaAC.net
>>432
Debian 9で普通にmakeしたらできたけど?
正確にはDockerのbuildpack-depsだけど
443:デフォルトの名無しさん
19/07/31 23:39:26.64 8xUIRaAC.net
おや?最新版、2019-07-22版でビルド失敗した。
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
URLリンク(cdn.netbsd.org)
444:デフォルトの名無しさん
19/07/31 23:57:18.53 8xUIRaAC.net
2019-06-13までは普通にビルドできるね
2019-07-15からビルドに失敗するようになってる
445:デフォルトの名無しさん
19/08/01 02:58:17.41 PmXIwIbo.net
>>435
情報ありがとう。古いので試してみるわ。
446:デフォルトの名無しさん
19/08/01 11:35:33.85 czAE5CE0.net
関数の中は、set -eで止めたいけど、関数の外では(後処理をするために)止めたくないって場合が辛いわ
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
447: false echo 2 } でも呼び出し側では必ず後処理をしたいから止めたくない。 set +e foo echo "後処理" これだと止まってしまうから、foo &&: とかすると 今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様? ( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、 fooがサブシェルなので、fooの中で定義した変数にアクセスできない 困った
448:デフォルトの名無しさん
19/08/01 12:20:40.41 aVYnxNEs.net
>>431
それは犀の角が一本だからという、特にひねりのない喩え。
449:デフォルトの名無しさん
19/08/01 12:25:28.77 iHxbPEOX.net
set -eはshellをexitするから当然の動作じゃない?
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
450:デフォルトの名無しさん
19/08/01 13:07:42.24 lJwvTmEp.net
後処理だけなら、trap '後処理' ERR でやれば
根本的に -e の使い方が違うと思うけど
451:デフォルトの名無しさん
19/08/01 13:10:18.98 bR99qXsR.net
$ dash
$ trap : ERR
trap: ERR: bad trap
452:デフォルトの名無しさん
19/08/01 13:15:37.05 lJwvTmEp.net
EXIT でもいいぞ
453:デフォルトの名無しさん
19/08/01 13:17:58.23 bR99qXsR.net
どうやってEXITから終了せずに通常の流れに戻すの?
454:デフォルトの名無しさん
19/08/01 13:19:11.98 lJwvTmEp.net
なんやお前は
「後処理だけなら」って言ってるだろ
455:デフォルトの名無しさん
19/08/01 15:30:04.66 WaJjQk0q.net
SIGHUT とかのシグナル部分を書くとか?
456:デフォルトの名無しさん
19/08/01 20:47:35.88 SQRHjrcQ.net
func() {
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
457:デフォルトの名無しさん
19/08/01 21:31:03.39 2c4IvXw2.net
>>446
戻り値123を!しているから0になっただけでは
458:デフォルトの名無しさん
19/08/01 21:33:30.40 SQRHjrcQ.net
こう書けってことか?
面倒くさいな
if func; then
:
else
echo $?
fi
459:デフォルトの名無しさん
19/08/01 22:05:20.92 Ye1sT2dv.net
func || echo $? でいいんじゃね
460:デフォルトの名無しさん
19/08/01 22:10:56.38 SQRHjrcQ.net
実際にはecho $?以外にもすることがあるから
461:デフォルトの名無しさん
19/08/01 22:27:36.45 Ye1sT2dv.net
んじゃ、
func || { echo $?; ... ; }
とか。
462:デフォルトの名無しさん
19/08/02 02:34:53.77 hQ+yEyXN.net
Cじゃないから終了コードをそんな風に使わないほうが良い気がする…
あくまで「気がする」だけだけど
463:デフォルトの名無しさん
19/08/02 02:59:49.78 O3iYpUQI.net
値が 0 とそれ以外だけではなく、
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
464:デフォルトの名無しさん
19/08/02 03:02:36.73 O3iYpUQI.net
ああ、そんな風 = 返り値が勝手に暗黙的に変わる変わらないってことかな?
だったらほぼ同意
465:デフォルトの名無しさん
19/08/02 03:40:21.45 hQ+yEyXN.net
>>453
あー。例えばあるコマンドで「ファイルが無い」ことを示すのに
exit 32が返ってくるとして
それに応じた最適なエラー処理をするってことかな?
466:デフォルトの名無しさん
19/08/02 03:54:22.19 O3iYpUQI.net
まあ元レスの人がどういう使い方をしたいのかわからんけど、そういう感じ
467:デフォルトの名無しさん
19/08/02 07:48:45.01 hQ+yEyXN.net
bcコマンドで階乗計算をしたくてコードを書いてるんだけど↓
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
468:デフォルトの名無しさん
19/08/02 07:49:38.54 hQ+yEyXN.net
ごめん一行目のn=2は無視って。
469:デフォルトの名無しさん
19/08/02 08:02:59.58 XJV5qmce.net
define f(n) {
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
470:デフォルトの名無しさん
19/08/02 08:15:06.73 hQ+yEyXN.net
>>459
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
URLリンク(pubs.opengroup.org)
471:デフォルトの名無しさん
19/08/02 08:42:59.37 dUmy9lW0.net
elseはGNU拡張
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
472:デフォルトの名無しさん
19/08/02 09:23:07.90 7tJhBDcy.net
>>438
それ喩える意味あるぅ?
情報量低すぎるどころか混乱を招いて逆効果だわ。
「グーはチョキに勝つ。そう、斧が槍に強いように」とか言われてる気分。
473:デフォルトの名無しさん
19/08/02 11:27:07.42 hQ+yEyXN.net
世の中には例え話を持ち出さないと気が済まない人が一定数存在する。
474:デフォルトの名無しさん
19/08/02 12:50:24.63 vUPSv33I.net
>>462
知らんけど昔の人が思い付いていいと思ったから書いたんだろう。
475:デフォルトの名無しさん
19/08/02 12:51:11.15 hQ+yEyXN.net
>>190 WindowsにJavaが入るかもって話あったの?そもそもそんな話すらなくね?
476:デフォルトの名無しさん
19/08/02 13:50:46.03 pa9nweBb.net
>>465
昔あったっしょ
Microsoft J++だったっけ?
JDirectとか言うCOMかActiveXコントロールかを直接呼び出せる機能拡張付きで、
それにSunがケチを付けて(確か)裁判沙汰になって、結局廃止になったやつ
TCKにも通らないだろうからJavaは名乗れないはずだけど
477:デフォルトの名無しさん
19/08/02 13:54:51.56 xsQQm7uF.net
>>465
90年代後半にだな・・・
478:デフォルトの名無しさん
19/08/02 13:57:46.29 XJV5qmce.net
「マイクロソフトが Java に塩を混ぜた!」ってやつか
479:デフォルトの名無しさん
19/08/02 20:32:46.34 hQ+yEyXN.net
sedかなにかで↓
<td>
AAAA
</td>
<td>
BBBB
</td>
↑っていうデータのBBBを取り出したい。
残念なことにtdにIDやらなにやらが賦与されてないから手段としては
「1番目に表われた/<td>/<\/td>/は無視って2番目の/<td>/<\/td>/の中身を表示する」
っていうのになると思う。しかし方法が思い付かない……。
できればsed, awkあたりで処理できればいいなと思ってるんだけど,どなたか力を貸してほしい。
上のデータだけど,「実際はもっと複雑でtableが入れ子になってる」とかそういうことはないです。
480:デフォルトの名無しさん
19/08/02 20:38:11.21 cEuue6ob.net
なら5行目を取り出せばいいじゃん
481:デフォルトの名無しさん
19/08/02 20:40:10.25 2UnKye9C.net
/^<td>$/{n;/BBB/p}
482:デフォルトの名無しさん
19/08/02 20:44:47.38 O3iYpUQI.net
今までのレスからはそんな質問するはずがないとしか思えないんだけどw
<td>AAA
</td>
<td>
BBB</td>
なんぞリターンがあってもなくてもいいというhtml/xmlらしく、行がちゃんとしているわけではないとか?
483:デフォルトの名無しさん
19/08/02 21:06:45.26 dUmy9lW0.net
>>469
俺ならシェルスクリプト使わずにHTMLパーサに食わせるな
nodejsでcheerio使うとか楽な方法を選ぶね
484:デフォルトの名無しさん
19/08/02 21:06:52.97 XJV5qmce.net
GNU sed の -z オプションを使って
$ sed -rz 's:.*</td>\n?<td>\n?(.*)</td>.*:\1:' data.html
485:デフォルトの名無しさん
19/08/02 21:07:39.38 hQ+yEyXN.net
>>472
そうです。相手はHTMLなんで改行されてない場合が普通にあるんです……。
つくづくUnixツールとマークアップ言語は相性悪いなぁと思いますw
486:デフォルトの名無しさん
19/08/02 21:30:15.54 XJV5qmce.net
GNU grep ならこんな感じ
$ grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
487:デフォルトの名無しさん
19/08/02 21:35:20.07 hQ+yEyXN.net
>>476
すげぇ!
ありがとうございます!とりあえず脳死状態でコピペさせていただきます。
正規表現の勉強しないとなぁ……。
488:デフォルトの名無しさん
19/08/02 21:38:37.66 cEuue6ob.net
正直、CLIツール使って一発でやってしまおう!
なんて考えるから難しくなるんだよ。
一行一データになってないものは、
シェルスクリプトでやったほうが楽
#!/bin/sh
a=$(cat html.txt)
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
489:デフォルトの名無しさん
19/08/02 21:38:54.44 +p+nzQa3.net
>>475
>を>\nにして\n\nを\nにすればいいだけじゃないの?
490:デフォルトの名無しさん
19/08/02 21:59:02.93 T1FFAKuC.net
xmllint使えは禁句なの?
491:デフォルトの名無しさん
19/08/02 22:00:05.58 G/LyK8vk.net
Ruby なら、すべての改行を削除してから、最短マッチ
str = <<"EOT"
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
str.delete!( "\n" ) # すべての改行を削除する
re = /<td>(.*?)<\/td>/ # ? は最短マッチ
p results = str.scan( re ).flatten
# ["AAAA", "BBBB"]
p results[ 1 ]
# "BBBB"
492:デフォルトの名無しさん
19/08/02 22:47:11.19 hQ+yEyXN.net
>>480
残念ながらそのHTMLは整形形式じゃないのでマトモに解析できないんです。
493:481
19/08/02 23:15:30.78 G/LyK8vk.net
Ruby で、nokogiri パーサーなら、
require 'nokogiri'
doc = Nokogiri::HTML( <<EOT.delete( "\n" ) ) # すべての改行を削除する
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
elements = doc.css( "td" )
p elements.first.content #=> "AAAA"
p elements[ 1 ].content #=> "BBBB"
494:デフォルトの名無しさん
19/08/02 23:29:54.36 pa9nweBb.net
>>476
\Kじゃなくて(?<=..._)で書いたほうが読みやすくね?とか思ったけど
PerlやPCREじゃlookbehindに可変長になるパターンは指定できないのか
JavaScriptだと通るんだよね....
495:デフォルトの名無しさん
19/08/02 23:34:34.72 cEuue6ob.net
Ruby遅すぎるんだよ
$ time ruby html.rb
"AAAA"
"BBBB"
real 0m0.079s
user 0m0.079s
sys 0m0.000s
$ time sh html.sh
BBBB
real 0m0.002s
user 0m0.002s
sys 0m0.000s
496:デフォルトの名無しさん
19/08/02 23:36:49.26 cEuue6ob.net
これも遅いな。やっぱりシェルスクリプトが一番か
$ time grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
BBBB
real 0m0.003s
user 0m0.004s
sys 0m0.003s
497:デフォルトの名無しさん
19/08/02 23:38:32.60 cEuue6ob.net
こうしたらさらに速くなったわw
シェルスクリプト最強伝説
#!/bin/sh
a="
<td>
AAAA
</td>
<td>
BBBB
</td>
"
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
$ time sh html.sh
BBBB
real 0m0.001s
user 0m0.001s
sys 0m0.000s
498:デフォルトの名無しさん
19/08/02 23:46:41.69 dUmy9lW0.net
>>487
スクレイピングする時にそんなコード毎回書くわけ?
499:デフォルトの名無しさん
19/08/02 23:58:58.92 2UnKye9C.net
a#*
a%% あたりがシェルスクリプト独自の難読パーツだが
覚えたら高速なのか...
500:デフォルトの名無しさん
19/08/03 00:25:50.69 i7fqO3Sj.net
>>489
どっかの書籍(確かオライリー)に
数字を考えて#は数字の前に,%は数字の後に付ける。
という連想から
#及び##は前から削る,%及び%%は後から削ると覚えるといいと書いてあった。
501:デフォルトの名無しさん
19/08/03 00:33:21.53 dYT3TwZL.net
自分は
キーボードの左側: # -> prefix
キーボードの右側: % -> suffix
で、削るんだっったっけ?残すんだったっけ?
結局毎回調べるという体たらく
502:デフォルトの名無しさん
19/08/03 00:40:18.71 9AEx1UEu.net
>>490
thanks
503:デフォルトの名無しさん
19/08/03 00:57:31.70 37D8ZUar.net
>>482
ブラウザでF12キーでコンソール開いて、
var q = (xml, query) => new DOMParser().parseFromString(`<xml>${xml}</xml>`, 'application/xml').querySelector(query).innerHTML.trim();
var text = q(`
<td>
AAAA
</td>
<td>
BBBB
</td>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
xmlとしてのパースだから、
q(`<chinko>AAAA</chinko><chinko>BBBB</chinko>`, 'chinko:nth-of-type(2)');
とかでも大丈夫。
一方htmlとしてもパースできるけど少なくともtableタグは補わなきゃならんね↓
var q = (html, query) => new DOMParser().parseFromString(html, 'text/html').querySelector(query).innerHTML.trim();
var text = q(`
<table>
<td>
AAAA
</td>
<td>
BBBB
</td>
</table>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
504:デフォルトの名無しさん
19/08/03 03:42:42.10 eOXqQaf9.net
>>490
> 数字を考えて#は数字の前に,
あー、ナンバーサインか
俺は、コメントだから頭につけるって覚えてたわ
%は同じく100%の%で後ろって覚えてたけど
505:デフォルトの名無しさん
19/08/03 04:43:13.91 i7fqO3Sj.net
>>494
俺含め日本人には#42みたいなのは馴染み薄いよね…
まあ「全く知らない概念」ではなかったから
とりあえず#は前,%は後,というように覚えられたけど。
コメントっていうのはいい案だと思う。
シェルスクリプトを書いている全員が把握できる概念だから。
506:デフォルトの名無しさん
19/08/03 05:33:16.75 20yQPXqo.net
ナンバナィン?
#はスーパーユーザで%はcshだな
507:デフォルトの名無しさん
19/08/03 06:07:39.94 l2kKbyZy.net
シェルスクリプトの#と%はなんとなく使えてるが正規表現の前後読みは未だに無理ポ
508:デフォルトの名無しさん
19/08/03 06:23:53.55 i7fqO3Sj.net
正規表現の割と新しめの拡張は
既存のメタ文字と被らないようになってるから類推しにくい記号になってしまってる場合が多い。
…まあ出典とかなくて俺の予想だけどw
最近だと「名前空間」的な概念が登場して\p{Kata}みたいな書き方が増えてきて助かる。
覚えるの簡単!
509:デフォルトの名無しさん
19/08/03 08:10:24.89 GWDLl7Iz.net
なんのこっちゃと思ったら.NETか
[:Katakana:]でいいんじゃないか。すでにあるからわかりやすいし
思惑でそうしてないんだろうけど
510:デフォルトの名無しさん
19/08/03 09:10:18.89 i7fqO3Sj.net
>>499
いや\p{Kata}っていう正規表現が使えるのはかなり広範な言語よ
少くともICUバインディングがあれば使える筈。
511:デフォルトの名無しさん
19/08/03 09:11:02.22 i7fqO3Sj.net
逆に.NETでUnicodeロケールの正規表現が使えるとは思いもよらなんだ
512:デフォルトの名無しさん
19/08/03 09:42:41.49 9AEx1UEu.net
...| perl -pe 's{" [^"]+ "}{ $& =~ s/ /-/gr }xeg'|...
awk でもできるかもしれないけどこの正規表現が便利
"text with blank space" の中だけ空白を-で詰め物するのに使っている
空白があると正常に動作しないコードの前パイプに挟む
513:デフォルトの名無しさん
19/08/03 10:30:59.00 i7fqO3Sj.net
>>502
なんかコマンドの引数の仕様とかを利用して
POSIXの範囲で実装できそう。
もちろんperlで十分だけど。
abc def "text with blacket" dee
に対して
abc def "text-with-blacket" dee
ってい出力を返す訳だから
for str in abc def "text-with-blacket" dee; do
printf '%s\n' "$str" | tr ' ' '-'
done | tr '\n' ' '
とか?
あ,駄目だこれだと"が戻ってこねーw
514:デフォルトの名無しさん
19/08/03 11:33:18.72 63RDVzrz.net
無理やり
echo 'abc def "text with blcket" dee' |
sed -E 's:^(.*)"([^"]*)"(.*)$:printf "%s\\"%s\\"%s\n" "\1" $(echo "\2"|tr " " "-") "\3":e'
515:デフォルトの名無しさん
19/08/03 11:35:32.45 l2kKbyZy.net
$ echo やまだヤマダ山田 | grep -oP "\p{Katakana}"
ヤ
マ
ダ
-o使うと改行されるのね
516:デフォルトの名無しさん
19/08/03 12:22:48.42
517:63RDVzrz.net
518:デフォルトの名無しさん
19/08/03 13:09:38.57 H1MpioV8.net
>>485
何百ページもパースするの?
Ruby でも十分早いと思うけどなあ
519:デフォルトの名無しさん
19/08/03 13:55:12.22 dYT3TwZL.net
40秒で支度しな
520:デフォルトの名無しさん
19/08/04 17:11:27.60 d0z5l48N.net
俺だったらperl使って全部読んで長い一行として扱って抜き出すか、または XML::Simple モジュール使って変数に展開してから取り出すかするかな。
つまり、シェルスクリプトは使わない。やってやれないことはないと思うが複雑怪奇なものになりそうなので。
521:デフォルトの名無しさん
19/08/04 17:12:43.83 d0z5l48N.net
あ、リロード忘れて書いたら山盛りで他の書き込みが・・・
俺の書いたことは忘れてくれ。
522:デフォルトの名無しさん
19/08/04 17:13:02.34 arZQ1GVT.net
【小沢が育てた刺客】 山本太郎「政権を仕留める」
スレリンク(giin板)
523:デフォルトの名無しさん
19/08/04 18:10:11.11 d0z5l48N.net
丸くても刺客
524:デフォルトの名無しさん
19/08/04 18:11:50.20 M00OQnGm.net
40秒で刺客しな
525:デフォルトの名無しさん
19/08/04 18:22:43.73 OC9PgLo7.net
PythonのBeautifulSoupだと、パーサーにCで書かれたlxmlを選べるようになってるんだが、
そういうの使えば、シェルの方が断然速いとはならないんじゃないかな?
PerlとかRubyにも似たようなのはあるでしょ。
526:デフォルトの名無しさん
19/08/04 18:40:40.05 zjBZp1dd.net
ディレクトリに、test01 ~ test99 ファイルがある時に、
test100, test101 と、ファイルを増やしていくと、
表示順が、test20, test21 などよりも、
test100, test101 の方が、先に来るようになった
これらを数字順で表示するには、どういうフィルターを作れば良いでしょう?
まあ、すべてのファイル名を、test001 など、3桁表示に変えれば、解決するけど
527:デフォルトの名無しさん
19/08/04 19:18:29.22 ApCAdEzq.net
>>515
プレフィクスが一緒なら
そのプレフィクスと0パディングを切り取ってsortに掛ければいいんじゃないかな。
で並び換えたものにプレフィクスと%0dを追加する。
ファイル名じゃなくてすまんが↓こんな感じ?
$ <<. sed 's/test0*//1' | sort -n | while read line; do printf 'test%02d\n' $line; done
test99
test100
test21
test01
test20
test101
.
528:516
19/08/04 19:38:16.75 ApCAdEzq.net
改良。あとsort -nって0埋め関係ないんだな。
URLリンク(pubs.opengroup.org)
ls -1 test* | sed 's/^test//' | sort -n | xargs -I @ printf 'test%02d\n' @
529:デフォルトの名無しさん
19/08/04 19:45:40.73 ZVJM9ExE.net
>>515
GNUのsortなら-Vオプションがあるけど...
ls | sort -V
あるいはtest[0-9]*のファイルだけなら
ls | sort -t t -k 3n
とか(汚いけど)
530:デフォルトの名無しさん
19/08/04 20:01:45.96 hlZDnb3L.net
>>515
ls -v
531:デフォルトの名無しさん
19/08/04 20:02:42.33 /i7K4ZYC.net
>>515
GNU coreutils の ls コマンドなら -v オプションで version sort してくれる
$ ls -v test*
$ man ls
-v natural sort of (version) numbers within text
532:デフォルトの名無しさん
19/08/04 20:05:19.04 KSih4AJE.net
となるとMacは切り捨てだな
533:デフォルトの名無しさん
19/08/04 20:06:51.77 ZVJM9ExE.net
おお、lsにも-vオプションあったっけ
534:515
19/08/04 21:06:16.73 zjBZp1dd.net
>>518
GNUのsort、-V オプション
ls | sort -V
これは便利!
535:デフォルトの名無しさん
19/08/04 21:11:25.12 WhAPGaK9.net
sort --help には
-V, --version-sort 自然な (バージョン) 数字順でソートする
って書いてあるけどさ、これセマンティクスバージョニングでの
比較にちゃんとなってるの?正確な仕様がわからん
536:デフォルトの名無しさん
19/08/04 21:14:26.03 ApCAdEzq.net
なんにせよ可搬性ないからあまり使わんほうがいい
537:デフォルトの名無しさん
19/08/04 23:41:22.05 fspxWXLG.net
シェルスクリプトに可搬性期待するなって結論出たろ
538:デフォルトの名無しさん
19/08/05 00:49:19.74 uR0Am4u5.net
bashごと持って行けばいいんじゃね?
他のインタプリタ系の言語ってみんなそうしてるっしょ?
539:デフォルトの名無しさん
19/08/05 00:58:52.07 lQJxfKJu.net
>>526
馬鹿だなぁ。sortはシェルスクリプトじゃないよ。
sortコマンドだよ。可搬性がないのはsortコマンドだよ。
シェルスクリプトで実装すれば可搬性があるよ
540:デフォルトの名無しさん
19/08/05 01:59:22.26 053u+cPb.net
sortは-hもよく使うな
du -hc * | sort -hみたいに
541:デフォルトの名無しさん
19/08/05 02:53:17.73 IFzEkeeB.net
>>527
sortコマンドはBash組込みコマンドじゃないから関係ないんじゃ…
542:デフォルトの名無しさん
19/08/05 04:07:47.17 RegSSUKZ.net
busyboxをスクリプトに同梱して、
全部これに解釈させればいいじゃん
ashに加えて、よく使うコマンドも一緒についてくる
543:デフォルトの名無しさん
19/08/05 04:23:15.10 IFzEkeeB.net
いいじゃんと言われても…いいね。としか答えようがないw
544:デフォルトの名無しさん
19/08/05 06:43:25.45 IFzEkeeB.net
exitコマンドってexit $?とやってやらなくても前に実行したコマンドの終了コードを見てくれるんだな。
ずっとexit $?ってやってたわw
545:デフォルトの名無しさん
19/08/05 07:20:51.08 O6CFE/yb.net
if $? でやるより
&& || で分岐したほうが らしい 感じにならないか?
546:デフォルトの名無しさん
19/08/05 08:03:05.75 IFzEkeeB.net
>>534
ああいや。
埋め込みシェルスクリプト(←なんて呼べばいいのか知らんけど
実行形式のファイルで冒頭に書かれてることがある
そのファイル自身を伸長するシェルスクリプトのこと)
で使ってたのよ。
#!/bin/sh
< "$0" sed -n '5,$p' | unar -
exit $?
こっからZIP
↑みたいに。
547:デフォルトの名無しさん
19/08/05 11:46:23.87 MNXFY7cg.net
tputの存在理由はわかるが
現実的な問題として、どういう場合にtput使ってよかったって思える?
もうエスケープシーケンス決め打ちでよくね?
548:デフォルトの名無しさん
19/08/05 12:52:22.28 IFzEkeeB.net
clearコマンドがPOSIXで定められていないのをいいことに実装されていない環境がある。
そのときにtput clear。
549:デフォルトの名無しさん
19/08/05 13:19:56.72 MNXFY7cg.net
> 実装されていない環境がある。
「現実的な問題」っていうのはその実装されてない環境なんて、
今どきあるの?って話なんだよ。
550:デフォルトの名無しさん
19/08/05 13:23:05.75 MNXFY7cg.net
clearが実装されてない環境より
tputが実装されてない環境のほうが多くて、
tputを使うと逆に動かない環境の方が多くなっちゃう
例えばbusyboxとかalpine linuxとか
551:デフォルトの名無しさん
19/08/05 13:31:42.54 O6CFE/yb.net
which clear >/dev/null 2>&1 && echo has || echo 404
両対応書いておけばいい
552:デフォルトの名無しさん
19/08/05 14:26:42.83 MNXFY7cg.net
/usr/share/terminfoの中を見てみたが、
シンボリックリンクを抜かして1700ものファイルがあった。
なるほどこれは大変だ。だがその中でどれだけのものが使われているのだろうか?
またどれだけ違いがあるのだろうか?ほとんどは細かい(殆ど使われない)
機能の違いでしか無いのではないか?
大抵は色を変えるぐらいしか使わないだろうし、
それ以上使っても画面サイズとカーソル移動ぐらいだろう。
数パターンしか違わないのであれば、独自対応も可能だろう。
実用レベルで考えるとtputを使うことは、使わないよりもデメリットが大きい気がしている。
553:デフォルトの名無しさん
19/08/05 14:33:25.56 IMjI9HmJ.net
vt100, xterm 以外設定した覚えがないな
554:デフォルトの名無しさん
19/08/05 14:47:57.15 MNXFY7cg.net
おそらく端末名の後ろは細かいバリエーションだろうからと削ってみたら789種類にまで減った
それでも数が多すぎるかつこんなの誰も使ってないやろと思ってしまって
何が違うのか把握する気が起きないレベル
でもinfocmpとか便利だな。よし俺の中で方針が決まった。
もしこれらの端末に対応しなければいけない自体になったら、
プログラムで直接tputを使用するのではなく、tputと同じ引き数で関数を実行しますから、
それで出力するエスケープシーケンスは設定ファイルで書き換えられるって方式にしよう。
さしあたって、現状、色を変えるだけしかやっとらんのだがtput使う必要あるのかな?
555:デフォルトの名無しさん
19/08/05 14:55:51.10 uR0Am4u5.net
なんであるものを使わないんだろう
二段階認証おじさんみたいな頭の構造なんだろうか
556:デフォルトの名無しさん
19/08/05 15:27:49.43 MNXFY7cg.net
> なんであるものを使わないんだろう
書いたでしょ? tputコマンドがない環境が現実としてある。
557:デフォルトの名無しさん
19/08/05 15:54:00.38 MNXFY7cg.net
簡単なスクリプトを書いて、とりあえずcolsについて
データベースに登録されてる1700端末をすべて調べてみたが
すべてが 0x31 0x33 0x31 0x0a だった
boldだと非対応を除いて892端末。44パターン。結構違いがあるな
setafだと340端末、11パターン
まあtputを使うほうが楽だってのはわかるけど、エスケープシーケンスが違うのは
マイナー端末だろうし、数の割にパターン数は限られているので
完璧を求めたいなら別だけど使う環境で動けば良いわけで、tputを使用するのは過剰な気がするな。
558:デフォルトの名無しさん
19/08/05 15:55:50.50 IMjI9HmJ.net
tputがない環境って例えば何?
559:デフォルトの名無しさん
19/08/05 16:04:49.48 MNXFY7cg.net
む、/lib/terminfo/ 以下にも定義ファイルがあるのか
xterm-256colorがないのに使えると思ったら
まあ +40個しか変わらんけど
560:デフォルトの名無しさん
19/08/05 16:05:10.32 MNXFY7cg.net
>>547
書いたんだから上見ろ
561:デフォルトの名無しさん
19/08/05 16:11:29.93 IMjI9HmJ.net
まあいいけど日記はブログで書けや
562:デフォルトの名無しさん
19/08/05 16:18:56.02 MNXFY7cg.net
ブログねーしw ここはみんなのらくがき帳だ
563:デフォルトの名無しさん
19/08/05 18:58:04.34 7Al1V6ob.net
シェルスクリプトマスターの皆様
xxxxNN.txtというファイルが大量にあります(xxxxの部分はファイル名、NNの部分は0~99の連番)
NNの部分が50未満ならxxxx50.txtにNNが50以上ならxxxx99.txtに一括でリネームしたいのですがやり方教えてください
564:デフォルトの名無しさん
19/08/05 19:10:26.82 AegVyuQi.net
xxxx の部分はファイルによって異なるって前提でOK?
565:デフォルトの名無しさん
19/08/05 19:15:29.15 7Al1V6ob.net
>>553
YES
566:デフォルトの名無しさん
19/08/05 19:19:16.45 MNXFY7cg.net
無理に頭の体操的なことをせずに、こんな感じでいいでしょ?
for file in *; do
name=${file%[0-9]}
name=${name%[0-9]}
num=${file#$name}
[ $num -lt 50 ] && num=50 || num=99
mv "$file" "$name$num"
done
567:デフォルトの名無しさん
19/08/05 19:27:32.93 7Al1V6ob.net
>>555
ありがとうございます
早速試してみます!
568:デフォルトの名無しさん
19/08/05 19:28:09.53 MNXFY7cg.net
早速試すとか言ってるが、
適当に書いたからどうなっても知らんぞ。
569:デフォルトの名無しさん
19/08/05 21:05:22.75 O6CFE/yb.net
>>552
ファイル名に数字がまざってなければ
例ば[a-zA-Z]だったら
dry run は
| perl -pe 's{ \d+ }{ $& < 50 ? 50 : 99 }ex'
570:デフォルトの名無しさん
19/08/06 08:47:13.20 fNxvG1AN.net
ほとんど気にすることないと思うんだけどさ
みなさんが今まで携わってきたシステムでshが/bin/shにないシステムってあった?
URLリンク(pubs.opengroup.org)
ここによると/bin/shは既定されてない→つまり必ずしもあるとは限らない
みたいなんだけど、そんなシステムあるかね?
Solarisとかなら…と思ったけど/bin/shだったし。
571:デフォルトの名無しさん
19/08/06 10:09:19.90 9obbnMlM.net
Androidには/bin/shがないとか聞いたことあるな
572:デフォルトの名無しさん
19/08/06 10:19:48.23 4kzCwlOl.net
Androidはそもそも/binも/usrも無いな
mkshが/system/bin/shにある
573:デフォルトの名無しさん
19/08/06 10:27:23.06 9obbnMlM.net
Androidの環境ってよくわからん。
busyboxは採用して無くて、昔はtoolboxだったのが今はtoyboxを採用している。
しかしtoyboxのシェルであるtoyshは完成して無くてmkshを使っている。
という理解であってるんだろうか?
dockerfileないんかな?
574:デフォルトの名無しさん
19/08/06 17:00:21.88 g73t6D+3.net
Androidはヘッドレスでは立ち上がらんのじゃね?
昔見た限りだとinitスクリプト中でコケるんじゃないかと
575:デフォルトの名無しさん
19/08/07 00:56:40.08 3XS5MIC7.net
Toyboxなんてものがあるのか。
576:デフォルトの名無しさん
19/08/07 01:43:15.26 WK8NJ3/V.net
diffみたいに二つのファイルを開いて、一行ずつ交互に比較できないかな?
bash依存禁止で
577:デフォルトの名無しさん
19/08/07 01:49:50.14 r57RWdCS.net
diff使えばいいじゃん
578:デフォルトの名無しさん
19/08/07 01:57:20.41 QJETJeRx.net
diff のアルゴリズムは有名だから
あとはもっと具体的にどうさせたいのかによりそう
579:デフォルトの名無しさん
19/08/07 02:03:50.19 WK8NJ3/V.net
誰がdiffしたいっていったよ?
580:デフォルトの名無しさん
19/08/07 02:43:40.37 fPg/gK/3.net
paste コマンド使うとか。見づらいけどw
$ paste -d '\n' file_a file_b
581:デフォルトの名無しさん
19/08/07 02:47:37.40 WK8NJ3/V.net
一旦質問を忘れて
同時に二つのファイルを開いて処理したい
582:デフォルトの名無しさん
19/08/07 02:48:31.68 WK8NJ3/V.net
処理の内容は自由に変えられる
583:デフォルトの名無しさん
19/08/07 02:56:33.93 fPg/gK/3.net
他のスクリプト言語を使う方が幸せになれる様な気がする
584:デフォルトの名無しさん
19/08/07 03:19:53.88 prHDAaSE.net
>>568
こんな奴に誰が答えたいと思うだろうか?
585:デフォルトの名無しさん
19/08/07 03:26:49.06 arV/Dy+D.net
またいつもの奴か
586:デフォルトの名無しさん
19/08/07 03:43:34.68 3XS5MIC7.net
どうしてこう知識のない奴ほど傲慢なんだろうか。
587:デフォルトの名無しさん
19/08/07 06:41:35.91 5FNsDR6i.net
POSIXシェルのみで全て書くという縛りプレイが好きなんだろうw
POSIXは最低限のインターフェースを規格化しているだけで、結局はプラットフォーム別に書くしかないのが現状だからな
bashがあるならbashで書けばいい
GNU拡張が使えるなら使えばいい
あるもんは使えばいいんだよ
可搬性の幻想に囚われると逆に生産性が落ちる
588:デフォルトの名無しさん
19/08/07 06:56:03.49 5FNsDR6i.net
>>570
そんなの何やりたいのかで答えは変わってくるだろ
漠然とした質問には漠然とした回答しか返ってこないぞ
589:デフォルトの名無しさん
19/08/07 07:11:20.44 aj+f89Vu.net
>>575
パソコンの大先生にありがち。知識は少しはあると自負のアンバランスからだな
590:デフォルトの名無しさん
19/08/07 08:36:36.73 QJETJeRx.net
awk で丸飲みしちゃえ
1ファイル1配列
メモリ節約なら
1行ずつ読むのをシンクロさせる
591:デフォルトの名無しさん
19/08/07 11:22:21.65 WK8NJ3/V.net
>>575
ほんとそれなw
できるのに、知識ないやつほどぐだぐだとレスをする
答えられないのを質問者のせいにする
exec 3<file1.txt
exec 4<file2.txt
read -r file1<&3
read -r file2<&4
echo "$file1 $file2"
read -r file1<&3
read -r file2<&4
echo "$file1 $file2"
592:デフォルトの名無しさん
19/08/07 11:28:44.82 3XS5MIC7.net
重症だなこりゃ
593:デフォルトの名無しさん
19/08/07 11:31:15.75 WK8NJ3/V.net
ちなみに>>580は
一回目のechoはファイルの1行目、
二回目のechoはファイルの2行目が
ちゃんと表示されるからなw
お前ら勉強してちゃんと質問に答えられるようになれよ
中途半端な知識で満足するな
594:デフォルトの名無しさん
19/08/07 11:36:26.97 5FNsDR6i.net
>>581
覚えたてで見てほしくてしようがないんだよ
生暖かい目で見守ろうやw
595:デフォルトの名無しさん
19/08/07 11:37:40.18 WK8NJ3/V.net
などと、質問には答えずに
それでも悔しいからか、レスだけはするようで
596:デフォルトの名無しさん
19/08/07 11:41:40.99 9POPBXN5.net
すげえ嫌な感じの方法思い付いた。
まず二つのファイルの行数だけ wc -l で調べ、小さい方を max に入れておく。
n=1 にしてから max までループさせて、ループの中で awk を使って NR==$n の一行を双方のファイルから抜き出してそれぞれ別の変数に入れる。
なんてことをすると2つの(またはそれよりも多くの)ファイルから1行抜き出して何かをする事は可能だ。
しかし行が長くなればなるほど無駄な処理が増えて時間が掛かることは言うまでもない。
大変効率の悪い方法だ。
597:デフォルトの名無しさん
19/08/07 11:48:42.74 5FNsDR6i.net
>>582
それやりたいなら普通はpaste使うけどな
598:デフォルトの名無しさん
19/08/07 11:48:48.99 WK8NJ3/V.net
>>585
その効率の悪い方法を実装するとして、wcもawkもいらんのでは?
行数を数えるのも、特定の行を読み込むのもシェルスクリプトだけでできるし。
>>580のやり方、同時に2つのファイルを開いて処理する方法で
実現できないような場合には使えるかも。ファイルのサイズが小さいなら問題にならないし
599:デフォルトの名無しさん
19/08/07 11:48:50.45 9POPBXN5.net
>>580
おお。それでできるな。
600:デフォルトの名無しさん
19/08/07 11:51:13.86 9POPBXN5.net
>>586
あ、そうだね。
区切り文字とうするかだけの問題か。
601:デフォルトの名無しさん
19/08/07 11:53:37.08 WK8NJ3/V.net
>>586
> それやりたいなら普通はpaste使うけどな
残念ながらpasteでは自由な処理ができない
例えば、1つ目のファイルに書いてある命令を解釈しながら
2つ目のファイルを読み込んだり、他の処理をしたりとかね。
602:デフォルトの名無しさん
19/08/07 11:56:37.01 WK8NJ3/V.net
で、POSIXで簡単にできることを、答えられずに
他の言語でやれとか、自由な処理をしたいっていうのに
それを理解しない答えを返してる奴ら
質問者の俺自身に、完璧な答えを出された気持ちはどう?w
603:デフォルトの名無しさん
19/08/07 11:57:46.26 WK8NJ3/V.net
またいい問題を思いついたら、質問(?)してやるから
じゃーねーw
604:デフォルトの名無しさん
19/08/07 11:57:52.31 5FNsDR6i.net
>>590
だからやりたいことを先に言えよ
お前はシェルスクリプトの前に質問の仕方から勉強しろ
605:デフォルトの名無しさん
19/08/07 12:00:28.63 WK8NJ3/V.net
>>593
同時に二つのファイルを開いて処理したい
って言った。
処理の内容は自由に変えられる
って言った。
同時に二つのファイルを開く以外のなにも条件として出してない
それができれば、いろいろと応用が効く
特定のことしかできないdiffやpasteでは
処理の内容が変えられないだろ
606:デフォルトの名無しさん
19/08/07 12:03:18.97 5FNsDR6i.net
>>594
>>593
607:デフォルトの名無しさん
19/08/07 12:04:06.23 9POPBXN5.net
>>591
なんで自分でわかるのに質問したのか謎
608:デフォルトの名無しさん
19/08/07 12:06:48.70 5FNsDR6i.net
>>596
>>583
609:デフォルトの名無しさん
19/08/07 12:08:56.79 fPg/gK/3.net
うーん、、、こんな感じ?
$ paste -d '\n' file1 file2 | xargs -d '\n' -n 2 | sh
file1 と file2 の内容例
file1:
====
ls
cp
mv
====
file2:
====
.
x y
y z
====
610:デフォルトの名無しさん
19/08/07 12:15:06.92 9POPBXN5.net
あー。「どうだ俺はこんなにできるんだすごいだろう」みたいな。
じゃあ本当にやりたかった事は複数ファイル処理ではなくて自分の能力自慢か。
人から認められて承認欲求を満たしたいってことでもあるかな。
いつも人からバカにされてるから何かで人をバカにしたいというのもあるかも知れない。
合掌。
611:デフォルトの名無しさん
19/08/07 12:15:09.78 5FNsDR6i.net
>>598
後出し要件からするとそんな感じ
また要件変わると思うw
612:デフォルトの名無しさん
19/08/07 12:17:59.15 WK8NJ3/V.net
>>596
> なんで自分でわかるのに質問したのか謎
質問した時点では知らなかったよ?w
613:デフォルトの名無しさん
19/08/07 12:19:12.78 WK8NJ3/V.net
>>598
後出しじゃない用件を言うと、
処理したい内容を自由に変えられないといけない
要件は同時に二つのファイルを開いて
いろんな処理をしたいってことだけ
ま、もう答えは出したがw
614:デフォルトの名無しさん
19/08/07 12:21:45.21 WK8NJ3/V.net
>>599
最初に用件をちゃんといってるのに、例をいうとその例しかできない方法を出すし
その質問にたいする曲解を潰していくうちに、その時間で自分で調べて解決できてしまうんだから
どうしろっていうんだw
615:デフォルトの名無しさん
19/08/07 12:22:22.45 WK8NJ3/V.net
やっぱ「自決しました」で終わらせたほうが良かったか?
616:デフォルトの名無しさん
19/08/07 12:32:00.78 9POPBXN5.net
>>603
普通にわからなくて質問していてやがて自分でわかった場合、普通はそれまでに答えてくれた人に対するお礼をするしこういう方法で出来ましたと自分のやったことを書く。
君の場合なぜか答えてくれた人に対する感謝の念がない。書かれたことが間違いや見当外れのことであっても普通は書いてくれたというだけで感謝するものだ。
しないとするなら少なくともその質問は質問に偽装された何か別のものだ。
617:デフォルトの名無しさん
19/08/07 12:36:21.05 5FNsDR6i.net
>>604
teratailとかSOで叩かれてこい
618:デフォルトの名無しさん
19/08/07 12:37:21.72 WK8NJ3/V.net
>>605
いい加減、客様は神様です。はやめたほうが良いよw
619:デフォルトの名無しさん
19/08/07 12:42:23.91 9POPBXN5.net
>>607
言っている意味がわからない。何か特殊な宗教でも信奉しているのかね?
620:デフォルトの名無しさん
19/08/07 12:45:25.69 WK8NJ3/V.net
>>608
回答者のほうが偉いみたいな考え方。
質問者と回答者は対等です。
621:デフォルトの名無しさん
19/08/07 13:00:34.72 9POPBXN5.net
>>609
対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。
君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。
622:デフォルトの名無しさん
19/08/07 13:17:46.60 VwbuDBsd.net
>>610
どうやら日本の礼儀が理解できないようだ
今問題になっている隣国の人間なんだろう
623:デフォルトの名無しさん
19/08/07 13:23:21.21 WK8NJ3/V.net
日本の礼儀と隣国の話しかできないのが世界が狭いよな
624:デフォルトの名無しさん
19/08/07 13:27:24.72 9POPBXN5.net
>>611
何かを与えてくれたらお礼をするのは国に関係なくどこでも共通の礼儀だが、君はそれをしないばかりか与えてもらって当然と考えるとするならば、それは正に今の韓国と同じだね。
625:デフォルトの名無しさん
19/08/07 13:29:19.39 9POPBXN5.net
優遇して与えていた側に礼を言わないばかりか盗人猛々しいとでも言うかね?
626:デフォルトの名無しさん
19/08/07 13:31:40.13 WK8NJ3/V.net
ということで、質問に対して
答えを返した俺に感謝しろ
という話さ
627:デフォルトの名無しさん
19/08/07 13:37:09.23 5FNsDR6i.net
これ触っちゃあかんやつや
628:デフォルトの名無しさん
19/08/07 13:39:19.49 WK8NJ3/V.net
俺は別に自決しましたで終わらせても良かったんだが、
俺ができるってことを示さなければ、
シェルスクリプトで同時に二つのファイルを開けるってことも
知らなかったんだろうな
629:デフォルトの名無しさん
19/08/07 13:41:42.46 aj+f89Vu.net
>>616
それを触りすぎw
630:デフォルトの名無しさん
19/08/07 13:46:29.59 WK8NJ3/V.net
この先の人生、似たような問題に直面したとき、
今日の会話を思い出しながらも、なかったことにして
俺が回答したテクニックを使うのだろう
631:デフォルトの名無しさん
19/08/07 13:49:03.15 9POPBXN5.net
>>615
質問者は君自信だ。それに関しては君が君に感謝すれば良い。他の人は少なくとも同じ質問はしていないのだから君に感謝する必要はない。
という、普通の事が君にはわからないのか?発達障害か何かか?だったらしょうがないから形だけ他の人を真似て合わせろ。そうすれば無用なトラブルは減らせる。
632:デフォルトの名無しさん
19/08/07 13:51:39.12 WK8NJ3/V.net
ん?他の人って会話に参加してる人だけのことだと思ってるのか?
検索で見つけた人とかあるだろう。
相変わらず視野が狭いんだな。
633:デフォルトの名無しさん
19/08/07 14:04:14.01 WK8NJ3/V.net
検索した人は俺に感謝する。ここでレスしてたやつも同じ問題がでたとき
嫌々ながら俺に感謝する。ウィン♪ウィン♪ってやつではないか
634:デフォルトの名無しさん
19/08/07 14:08:05.92 9POPBXN5.net
>>621
おだいじに。
635:デフォルトの名無しさん
19/08/07 14:09:22.96 9POPBXN5.net
夏の暑さも酷なことをするもんだ。
636:デフォルトの名無しさん
19/08/07 14:11:08.56 WK8NJ3/V.net
エアコンもってないのか?
637:デフォルトの名無しさん
19/08/07 15:11:31.23 3XS5MIC7.net
どうでもいいけどアレを「完璧な回答」とか言ってる時点でお察しw
ファイルディスクリプタを使った方法にはPOSIXの範囲では解決できない重大な落とし穴がある。
まあ態々言わなくても分かるだろうから,明言はしないがw
638:デフォルトの名無しさん
19/08/07 15:23:56.01 3XS5MIC7.net
ああ一応分からん人の為にヒントをいうと,実は2018年あたりの過去スレで言及してる。
639:デフォルトの名無しさん
19/08/07 18:34:55.40 WK8NJ3/V.net
※その落とし穴がなんなのか言わないのは、わからん人のためよりも
俺に意地悪をすることを選んだから。結局それがそいつの本性なんだよ。
640:デフォルトの名無しさん
19/08/07 19:38:28.14 DcvmRDxD.net
{{"item1":["key1":"value1"]},{"item2":["key2":"value2"]}}
{{"item1":["key1":"value1"]}}
{}
{{"item1":["key1":"value1"]},{"item2":["key2":"value2"]},{"item3":["key3":"value3"]}}
みたいに中途半端なjsonがたくさん混ざっているファイルを
item1,item2,item3
value1,value2,
value1,,
,,
value1,value2,value3
のような綺麗なcsvで出力する方法ってありますか?
jqコマンドを使っても上手くいかず……
641:デフォルトの名無しさん
19/08/07 19:41:37.81 WK8NJ3/V.net
>>629
それ中途半端なjsonじゃねーよ
jsonlという形式だ。jsonエル
642:デフォルトの名無しさん
19/08/07 19:46:34.34 WK8NJ3/V.net
1行ずつループで回してもできそうだが、なんどもjqコマンドを呼び出すことになって
時間がかかりそうだから、
[
1行目 ,
2行目 ,
3行目 ,
4行目
]
みたいに変換して、jq一発にしたほうが速いだろうな。
そのやり方は、俺以外でも答えられるやろ?
643:デフォルトの名無しさん
19/08/07 22:04:49.28 fPg/gK/3.net
>>629
GNU awk 4.0.0 以降で
$ gawk -ijoin -vFPAT='"[^"]+"' '{
for(i=1;i<=NF;i+=3){
item[$i]=1
row[NR,$i]=$(i
644:+2) } }END{ for(i in item){x[n++]=i} n-- print join(x,0,n,",") for(i=1;i<=NR;i++){ k=0 for(j in x){ r[k++]=row[i,x[j]] } print join(r,0,n,",") } }' data.jsonl
645:デフォルトの名無しさん
19/08/08 02:47:04.99 /tBUMiMq.net
これは、Ruby で、JSON.parse できない。
何や、この形式は?
{"item1":["key1":"value1"]}
[ ] の中に、{ } を入れたら、OK だが、
{"item1":[{"key1":"value1"}]}
646:633
19/08/08 03:01:29.15 /tBUMiMq.net
URLリンク(jsonformatter.curiousconcept.com)
このサイトで、JSON の形式が正しいかどうかチェックしたら、エラーになった!
{"item1":["key1":"value1"]}
Error:Expecting comma or ], not colon.
647:デフォルトの名無しさん
19/08/08 03:55:09.53 10jj0QOT.net
>>632
すげえ!
口先だけの>>631とは全然違うわw
648:デフォルトの名無しさん
19/08/08 06:10:00.05 l7k6B2kQ.net
>>629
{{"item1":["key1":"value1"]}}
じゃなくて
{{"aaaa":["bbbb":"cccc"]}}
でも
"cccc" って表示されるけどOK?
あと {{"item1":["key1":"val\"ue1"]}}
みたいに " がデータに入ってる場合はあるの?
それと key1、key2、key3 ってキー名が変わるのは正しいの?
jsonlとしても正しくないけど、書き間違いじゃないの?
649:デフォルトの名無しさん
19/08/08 07:06:18.58 DLp++heI.net
>>629
これJSONじゃないしフォーマットおかしいってだけじゃね?
正しいJSONならjqだけでcsv変換できるぞ
650:633
19/08/08 07:20:32.75 /tBUMiMq.net
JavaScript で、: は、オブジェクトの属性だろ。
だから、{ } 内でしか使えない
だから、1 はダメで、2, 3 はOK
1. {"item1":["key1":"value1"]}
2.1 {"item1":["value1"]}
2.2 {"item1":["key1","value1"]}
3. {"item1":[{"key1":"value1"}]}
651:デフォルトの名無しさん
19/08/08 07:25:15.97 l7k6B2kQ.net
フォーマットが不自然なんだよな。独自フォーマットなら
その仕様を言ってくれないと答えようがない。
例えば、そこに書いてあるキー以外も存在するのか?とか
改行はどうなってるのかとか
652:デフォルトの名無しさん
19/08/08 09:21:44.35 rLFqUIXU.net
>>629は「中途半端なjson」と言ってるから分かってる気はするけど、
半可通な上司か先輩がJSONを分かったつもりになってるだけで
仕様なんかちゃんと考えて無いと思うなw
653:デフォルトの名無しさん
19/08/08 10:06:35.63 X/CTiqlR.net
本物のjsonにしちゃえ
独自フォーマットする利点ないでしょ
654:デフォルトの名無しさん
19/08/08 11:39:13.74 /tBUMiMq.net
独自形式など、作るだけ無駄
パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ!
655:デフォルトの名無しさん
19/08/08 11:47:10.43 FeKpuToe.net
昨日質問したものですが中途半端に書いてしまい申し訳ありませんでした
まだ勉強不足の学生でして……
こっちが正しいjsonと出力させたい内容です
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}}
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}}
{}
{"aaa":{"bbb":["ccc"]}}
↓
aaa,xxx,あああ
ccc,zzz,いいい
ccc,zzz,
,,
ccc,,
656:デフォルトの名無しさん
19/08/08 11:47:20.30 FeKpuToe.net
jsonlですね
657:デフォルトの名無しさん
19/08/08 11:53:47.59 FeKpuToe.net
aaa,xxx,あああ
ccc,zzz,ううう
ccc,zzz,
,,
ccc,,
です
658:デフォルトの名無しさん
19/08/08 12:28:53.27 FeKpuToe.net
連レスすみません
例えばaaaとあああだけ抜き取りたい場合
さきほどのjsonlから
aaa,あああ
ccc,ううう
ccc,
,
ccc,
と表示させる方法も知りたいです。
全部表示させた後にawkで削除した方がいいのでしょうか?
659:デフォルトの名無しさん
19/08/08 12:42:36.15 X/CTiqlR.net
使いまわせるから
...|awk 'Xxx'
660:デフォルトの名無しさん
19/08/08 12:46:24.42 0w2TiazL.net
>>643
学生なら先生に聞けばいいじゃん。
宿題?それでも先生に聞いていいんだよ。
まあ、ここでは丁度良いお題にもなるから良いかも知れないが、宿題の提出期限とかそちらの都合は無視されるよ。
661:デフォルトの名無しさん
19/08/08 12:56:15.36 PTwvjoI/.net
>>646
$ ... | cut -d, -f1,3
662:デフォルトの名無しさん
19/08/08 13:40:08.52 l7k6B2kQ.net
>>646
もとのデータが悪かっただけ。
jsonlだったらjqで普通に扱える。
echo "aaa,xxx,あああ";
jq -r '[.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]] | @csv' data.jsonl
ダブルクォートがいらないなら、@csvをjoin(",")にする
こことか見れば良い
URLリンク(medium.com)
663:デフォルトの名無しさん
19/08/08 14:01:33.05 SmETYGNQ.net
>>650
おおおおお!!!ありがとうございます!!!
自分がやったときは完全一致してないとエラーが起きてましたのでありがたいです
今後はROMってもっと勉強します
664:デフォルトの名無しさん
19/08/08 14:03:20.11 l7k6B2kQ.net
なるほどjqコマンドだけでやるにはこうすればいいのか
jq -r -s '["aaa","xxx","あああ"], (.[] | [.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]]) | @csv' data.jsonl
665:631
19/08/08 14:04:54.81 l7k6B2kQ.net
>>635
すげえだろ?
666:デフォルトの名無しさん
19/08/08 14:12:53.47 DLp++heI.net
なんだかなーw
667:デフォルトの名無しさん
19/08/08 14:16:46.09 SmETYGNQ.net
今調べてみたら
.aaa.bbb[]と入力していたので全部一致してないとエラーになってたっぽいです
.aaa.bbb[0]に変えている>>650では一致してないところも空欄で出力されてましたので求めるものでした
668:デフォルトの名無しさん
19/08/08 14:20:36.14 10jj0QOT.net
>>653
もしかして皮肉という概念をご存知ない…?
669:デフォルトの名無しさん
19/08/08 14:26:26.08 DLp++heI.net
>>655
それ配列ってことは要素数が1以上の場合もあるわけだよね
先頭だけでいいの?
670:デフォルトの名無しさん
19/08/08 14:29:47.06 SmETYGNQ.net
>>657
要素数は一つですので大丈夫です。
671:デフォルトの名無しさん
19/08/08 14:41:50.23 DLp++heI.net
>>658
問題ないならいいけど [0] より []? 使ったほうが良いよ
672:デフォルトの名無しさん
19/08/08 14:45:49.24 PRJfiUWC.net
bashって可変長引数で綺麗に処理できないの?
bash test.sh a b c d e
って打ったら
xaz,xbz,xcz,xdz,xez
bash test.sh a b c
って打ったら
xaz,xbz,xcz
って出るものを作りたいんだが$@を使って色々やっても
xa b c d ez,
って出力しかできぬ