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

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

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

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2020/02/10(月) 00:08:02.47ID:jvWR6fCp
https://github.com/att/ast/issues/1466

私はAT&T Labs Research で@lkoutsofiosと協力し、コミュニティが
快適な状態にレポを復元できるかどうかを確認するためにボランティアで参加しました。これは最後に#1464で議論されました。

私はkshや技術的な問題の専門家ではなく、歴史全体を知りませんが、私の理解は

1. ksh93u +は、AT&Tからの最終的な公式リリースです。これはブランチ2012-08-01-masterにあります

2. 後のバージョンであるksh93v-は、AT&Tを離れた後に元の作者によって提供されましたが、
このバージョンは安定しているとは見なされません。これはタグksh93vで見つけることができます

3. @ krader1961はmasterブランチを数年間維持しています。彼はコードベースを合理化しようとしました
(そしてastの残りではなくkshのみをサポートしました)が、これは互換性の問題を引き起こしました。
kshの元の作者はすべてAT&Tを去りました。社内にはまだ多くのユーザーがいますが、
プロジェクトを維持および管理できるユーザーはいません。
2020/02/10(月) 00:11:44.63ID:jvWR6fCp
私の提案は:

・ 現在のマスターをブランチ「ksh2020」(または適切なもの)に移動します。
・そのブランチのREADME.mdおよびCHANGELOG.mdをメンテナンスされていないものとして
明確にマークします。#1464をポイントし、詳細についてはこの問題を参照してください。
・ マスターブランチを2012-08-01-masterにリセットします
・リポジトリから外部の共同編集者を削除します。AT&Tの誰もこれを維持していないので、
このフォークをアクティブなものにすることは意味がありません。GitとGithubを使用すると、
誰でも自分のスペースで好きな方向にコードを取得できます。
2020/02/10(月) 00:12:00.37ID:jvWR6fCp
・ README.mdをクリーンアップして、現在の状態を反映します。「このレポには、ASTの
AT&T ksh93u +および試験的なksh93v-バージョンが含まれます。ASTおよびkshのフォークは
後である可能性があります。」
・ CONTRIBUTING.mdを変更し、テンプレートを明確にして、このフォークを
積極的に維持しておらず、何も確認しないことを約束します。
・リポジトリの説明を「AST-AT&T Software Technology」に短縮します(#1441)

これが完了したら、AT&Tでmasterブランチのksh93u +にパッチを提供する可能性があります。
些細なこと(ビルドの問題など)でない限り、貢献を確認したり受け入れたりすることはおそらくないでしょう。
最終的には、このリポジトリをアーカイブします。

現在、会社の誰もがkshのためだけにレポを作成するつもりはないと思います。
しかし、これはかなり簡単で、コミュニティが取り上げることができると思います。
2020/02/10(月) 00:27:01.24ID:jvWR6fCp
こういうこと?

1. AST-AT&T Software Technologyはkshだけのプロジェクトではない。kshはASTプロジェクトの一部
2. 誰かがkshだけをメンテナンスしていた。ASTプロジェクト全体をメンテナンスしてる人はいない
3. 今リリースされてるksh 2020はそれ
4. ksh 2020 は後方互換性がなく古いスクリプトが動かなくなっていた
5. それは困るのでmasterを2012-08-01-masterにリセットしてアーカイブする
6. AT&Tはこのリポジトリをメンテナンスしない。 誰か開発したいのなら、ksh2020ブランチから続きをやれ
7. ksh2020ブランチにはもうメンテナンスしてないって書いてあるからそれ消してから勝手に続きをやれ
2020/02/10(月) 08:02:14.12ID:RPv+4ALj
Google翻訳使うなとは言わないけど,わざわざそれをスレに載せるな。
せめて自分で訳したものならともかく,なんの情報でもない。
2020/02/10(月) 08:09:49.99ID:jvWR6fCp
え?翻訳すらしないでコピペすることだってあるじゃん
そういうのを引用っていうんだよ。
引用したらだめってこと?意味がわからないなぁ
2020/02/10(月) 11:18:22.31ID:RPv+4ALj
>>590
飛躍しすぎ。
スレと関係ないただの忠告になるからこれ以上言わんが、
引用するななんて一言も言ってないし,ただの引用のほうがよほどマシ。
ていうかGoogle翻訳したものを貼り付けて「引用」って……

あなたはGoogle翻訳(機械翻訳全般)を信じてるのかも知れないけれども,
2020年現在,これらの翻訳の質は,あなたが貼り付けた文章を見ても分かる通り,酷いもの。
半分「嘘っぱち」の文章が出てると言っても過言じゃない。
特に,機械翻訳の中でも,minhonやlibtr8nとは違って,Google翻訳は2018年ころから
「学習した英語・日本語訳文からそれっぽい文字の並びを引っ張ってくる」っていう手法を取るようになったから
「見てくれは他の機械翻訳より自然≠セけど内容が全くデタラメ」っていう最悪の事態を生み出すようになってしまった。
幸か不幸か,あなたが貼り付けた文章にそこまで酷い誤謬はないけど,上述の翻訳手法である以上,
Google翻訳した文書を貼り付けるのは,原文を貼り付けるより酷いばかりか,
何も情報を提供せずに各自がリンク先なんかで情報を確認するよう要求するほうがよほどマシなくらい。

あなたは悪気なくGoogle翻訳を使って,スレに貢献しようとしたのかもしれない。
リンク先の文書の内重要と思われる部分をスレ本体に引用することは悪いことじゃないけれど,
そこでGoogle翻訳を使ってしまうのは,ちょっとキツい言い方になるけど「嘘を教える」ことに繋がってきてしまう。

もしこれからリンク先の文章を引用する機会があれば,原文を貼り付けるか,下手でもいいから自分で翻訳してみてね。
2020/02/10(月) 11:56:29.56ID:jvWR6fCp
>>591
はは、的外れすぎてワロタw
英語をそのまま貼ってもリンク先読まない人が多いから
単に変換しただけ。英語というだけでスルーする
日本語ならぱっと見でわかる。内容が気になったのならリンク先読みなさい。
読んだのなら貼り付けた意味があったということ
2020/02/10(月) 19:24:20.30ID:SWS6qR4K
宮城県に住んでるだったかの誰かにそっくりだな
2020/02/10(月) 19:51:47.28ID:RPv+4ALj
>>593
もう放っておこうぜ。

俺なりにかなり丁寧に説明したんだけど,
どうも何について文句を言われてるかすら分かっていないようだから。
2020/02/10(月) 21:25:40.41ID:MJVq5TQy
>>591
こういう輩は長文を読む力がないのだから、こういえばいいんだよ
「日本語でおk」
2020/02/10(月) 21:40:51.77ID:4n8TqQDg
擁護賛同してるのか?あそこの初っ端は間違っているけどな
直してやれよ
2020/02/12(水) 17:16:49.73ID:SPYER+lN
コマンドの速度を測りたいときに出力を/dev/nullに捨てるとその影響で
出力を捨てないときより速く計測されてしまうことがあるんだけど
例:
$ time { < /usr/bin/od od -A nx -t x1 -v; }
...
出力略
...
real 0m0.055s
user 0m0.042s
sys 0m0.008s
$
$ time { < /usr/bin/od od -A nx -t x1 -v > /dev/null; }

real 0m0.020s
user 0m0.020s
sys 0m0.000s

これを防ぐために「端末上に書き出してるのと同じくらいの負荷が書かるけど、実際には端末上に出力されない」
みたいな状況を作りたい。
おしえてください。
2020/02/12(水) 17:58:00.53ID:44kLfG7j
pv 使うとか

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v; }
:

real 0m0.404s
user 0m0.024s
sys 0m0.005s

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; }
real 0m0.458s
user 0m0.019s
sys 0m0.007s
2020/02/12(水) 21:18:18.55ID:ngmZ90wk
>>597
画面に出力されてる時間のせいだから無理じゃね?
/dev/ttyにだせば端末上に出力されてるけど標準出力に影響はない
あとは出した上でエスケープシーケンスで消すとか
600597
垢版 |
2020/02/13(木) 19:02:20.33ID:qpgEIAWv
>>598
うーん。ちょっと偉そうな注文だけど
システム全体の設定を変更したり、
かつroot権限が必要なのはちょっと…

>>599
エスケープシーケンスは思い付かなかった。
でも出力の中に一つでも文字属性を元に戻すようなものが
含まれたりするとマズいよね(いやまあ,それに目を瞑ればいいだけの話なんだけど)…

どうも一般的な方法では無理そうなので,
ダラダラ出力させることにします。
困ることといえば端末のスクロール履歴が消えるくらいだし。
601デフォルトの名無しさん
垢版 |
2020/02/13(木) 19:45:08.54ID:d+A9Zjku
標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど
2020/02/15(土) 07:57:33.28ID:TqNhf8oX
ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから)
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。
2020/02/15(土) 09:41:54.81ID:LBGCL7FY
リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです?
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある
2020/02/15(土) 11:02:57.91ID:vIJrSTGq
>>603
スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ
# stdout を fd=3 にコピー
exec 3>&1

# fd=1,2 を foo.log にリダイレクト
exec > foo.log 2>&1

echo "foo.log に途中経過出力中です..." >&3
...
echo "処理B開始" >&3
...
echo "終了しました" >&3
2020/02/15(土) 13:14:38.75ID:QAGa8Flq
bashの問題なのか知らんけど、
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど
606デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:59:47.10ID:7hJxIdg7
>>605
sttyコマンドとか?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html
2020/02/15(土) 17:24:25.12ID:LBGCL7FY
>>604
foo.logには標準出力とエラーが両方保存される
>&3がある行だけが画面に出力される
よく出来てますわ
ログ取りに使えるのか
2020/02/15(土) 22:02:17.95ID:7TGox9oB
>>606
sttyコマンドなのかな?

詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。

evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。
2020/02/15(土) 23:22:52.25ID:FhP/kA+H
頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという
2020/02/15(土) 23:28:09.90ID:7TGox9oB
evalするときに何故か構文エラーが起きたり
ホワイトスペースがどこかで消えたりしている。
2020/02/15(土) 23:28:21.51ID:2teiXV5j
>詳細は言えないけど
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし
2020/02/15(土) 23:28:41.71ID:7TGox9oB
もちろんその環境以外ではそんな事は起きていない。
だから制御する方法があるのだろうと思ってるがわからない。
2020/02/15(土) 23:31:04.26ID:2teiXV5j
>>610
何かを求めたいなら具体的に書こうな。Terminalでのまんまとか
そのままじゃ何か問題があるなら、似たようなのに加工できるだろう
2020/02/15(土) 23:31:40.17ID:7TGox9oB
>>613
具体的に書くとまずいことがあるからわざとぼやかしてる
2020/02/15(土) 23:32:15.43ID:2teiXV5j
だったら、チラ裏なげえな
2020/02/15(土) 23:33:17.78ID:7TGox9oB
短くしたら、お前が俺にレスさせるようにしただけ。
最初に詳細は言えないって書いてるんだから察しろ
2020/02/15(土) 23:36:08.92ID:2teiXV5j
そうちゃんと読みとって>>611と書いているんだが。すでに
何かをまだ期待してちょっとだけな>>610をとか続けるようだからなんだがな
これ以上もうないだろけど
2020/02/15(土) 23:38:36.70ID:7TGox9oB
俺が>>610と続けた後に
お前が>>611を書いたんだろ

時系列ぐらい把握しろやw
2020/02/15(土) 23:40:02.90ID:2teiXV5j
残念ながら、>>611>>610なんてなかった時に書いたのだよ
お前は本当に自分視点しかなさすぎだぞw
2020/02/15(土) 23:50:22.01ID:7TGox9oB
>>619

>>610>>609へのレスだって気づいているか?
また書いていなかったとか言わないよなw

続けたのは俺じゃない。俺は最初から詳細は言えないと書いている。
2020/02/15(土) 23:52:28.65ID:cPtDrAlk
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
2020/02/15(土) 23:53:21.82ID:2teiXV5j
何を言っているのかなあ。意味不明すぎ
読めなさすぎだろう、独りよがりすぎだろう
2020/02/15(土) 23:57:25.05ID:7TGox9oB
理解能力がないという告白を見た瞬間w
2020/02/16(日) 00:03:10.55ID:0ownCpNF
>>609をみて、「頭悪いやつ〜おかしいのは〜お前の頭だろう」というのは言い過ぎだろう、わからないでもないけどw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた

そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに

>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw
2020/02/16(日) 00:06:52.88ID:0ownCpNF
誤 そしたらならなんか616があったりしたが
正 そしたらならなんか612があったりしたが
626デフォルトの名無しさん
垢版 |
2020/02/16(日) 09:10:15.42ID:xg4O4sK0
sort -kについて正しく分かり易いサイトはないですか?
2020/02/16(日) 12:16:49.32ID:O89bDljg
>>626
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html
2020/02/16(日) 12:17:20.39ID:k2/UeE1A
えいごなのでわかりやすくないです
2020/02/16(日) 12:50:45.03ID:tUbalZD+
https://github.com/coreutils/coreutils/blob/master/src/sort.c
2020/02/16(日) 13:15:28.05ID:U5VJnWmt
>>627
中国語の解説をご所望だそうだ
2020/02/16(日) 14:38:33.35ID:O89bDljg
おめーらイジワルだなw
2020/02/16(日) 15:33:45.11ID:iNVxJNOu
分かりやすい
http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x6993.htm
2020/02/17(月) 08:01:59.15ID:ZjAffcZp
与えられた数字のファイルの行番号になにかを書き込むスクリプトってどう書くのが一番いいですかね。
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…
2020/02/17(月) 10:14:55.01ID:LO6gJc6j
nl使えばいいだろ。POSIX標準の基本コマンド一覧見ろや
2020/02/17(月) 10:37:47.88ID:ZjAffcZp
>>634
nlにそんな機能あるの?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
↑ここ見る限り
指定した行になにかを書き込むなんていう機能なさそうなんだけど。
2020/02/17(月) 10:47:12.51ID:8g99SQEJ
こういう事?

seq 10 | sed '5s/.*/& Here/'
2020/02/17(月) 11:12:00.77ID:ZjAffcZp
>>636
そうそう、そんな感じ。
行番号自体は出力に要らないけどね。
ただ、それだと >>633 でも言った通り、
元のファイルがない状態から生成できないんだよ。

示してくれたスクリプトでも「10行出力する」
っていう前提があって始めて機能するよね。
やりたいのは全部で何行必要か分からない状態で
次々に指定した行に文字列を書き込むってこと。
638デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:40:41.78ID:xPbhxlpI
配列に書いて要素番号と共に出力すれば
2020/02/17(月) 14:53:39.21ID:qj5C8HtX
おまえらよく

与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな

与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw

入力と出力の例を出せば、すぐに解決する問題だろうに
2020/02/17(月) 14:56:06.69ID:qj5C8HtX
> やりたいのは全部で何行必要か分からない状態で
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり

何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか

示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?
2020/02/17(月) 15:06:30.32ID:y136Nw0W
行ごとに何か処理したいならawkの出番なのでは?
2020/02/17(月) 15:42:52.76ID:ZjAffcZp
>>639
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...

出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar

こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。
2020/02/17(月) 15:45:24.56ID:ZjAffcZp
>>641
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。

一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……

これはawkでどうにかするのは難しいのではと思います。
2020/02/17(月) 15:49:37.43ID:qj5C8HtX
行番号と文字列のペアが入ったデータ(ファイル)があって、
それに従って別のファイルの指定された行の頭に文字列を入れるってことね

ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw
2020/02/17(月) 15:50:05.60ID:P9Oy3OK5
先に行指定の最大値を取得すればええやろ?
2020/02/17(月) 15:54:20.48ID:y136Nw0W
それならもう無理せずperl,ruby,pythonあたりで書いたらいいんでないの?
2020/02/17(月) 16:01:09.81ID:qj5C8HtX
入力ファイル形式を
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい

あとは、こんな感じのスクリプトを書いて

i=1
while read -r num string; do
 while [ $i -lt "$num" ]; do
  echo
  i=$((i+1))
 done
 echo $string
 i=$((i+1))
done

cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
2020/02/17(月) 16:15:26.16ID:qj5C8HtX
>>646
ロジックはどの言語でも変わらないので
シェルスクリプトでそれを書けばいいだけ
2020/02/17(月) 16:25:32.91ID:qj5C8HtX
短くしてみた。バグとかはしらん

i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
2020/02/17(月) 16:31:22.20ID:2IQo7lRr
>>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
2020/02/17(月) 18:55:51.30ID:P9Oy3OK5
一旦配列に入れてからjoin風に出力
入力はsortされてなくても可

#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done

index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
2020/02/17(月) 21:12:48.06ID:ZjAffcZp
>>650
いや,ただたんに新規作成したい訳じゃない…
2020/02/18(火) 03:26:33.92ID:enVFBik2
Ruby で作った

以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する

ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル

結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!

行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること

3 あ い
7 ab

# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end

次へ続く
654653
垢版 |
2020/02/18(火) 03:27:41.15ID:enVFBik2
last_line_num = line_num_ary.last[ 0 ] # 最後の行番号
line_count = nil # ファイルの行数

if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end

# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )

# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
2020/02/18(火) 03:35:49.66ID:dYxIHNEw
>>649
これが一番だな。短くてbash依存なし。ruby依存なしw
2020/02/18(火) 09:24:28.92ID:2AC9Ct1n
いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
2020/02/18(火) 09:30:40.26ID:HqsHcaRa
別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
2020/02/18(火) 09:53:00.13ID:2AC9Ct1n
あ、普通に馬鹿なんだな。。
もしかしてユニケージの人か?
2020/02/18(火) 10:03:42.59ID:HqsHcaRa
ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
2020/02/18(火) 10:04:48.16ID:HqsHcaRa
文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
2020/02/18(火) 10:42:09.68ID:X2bVDQHa
> てきとーなスクリプト言語
シェルスクリプトとか?w
2020/02/18(火) 14:37:02.43ID:gCN/+gaX
>>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
2020/02/18(火) 15:45:01.04ID:fdBjlYYo
IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
2020/02/18(火) 17:27:39.45ID:X8dqmLc9
1 2
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
2020/02/18(火) 17:30:18.44ID:hjlsDnk2
1 と 2 の間にあるのがスペースなんじゃ…
2020/02/18(火) 20:22:18.38ID:wp4bvOJX
>>664
sed のダブルクォーテーションをシングルクォーテーションにするとどう?
もしくは s/\t/... じゃなくて s/\\t/... とか

>>665
tr の場合うまくいく理由の説明ができないんじゃ?
667デフォルトの名無しさん
垢版 |
2020/02/18(火) 20:27:51.93ID:VB0SzzBs
>>664
mac の sed は \t をタブ文字として扱わないらしいね

https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453

sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど
2020/02/18(火) 20:33:06.70ID:hjlsDnk2
tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと
2020/02/18(火) 21:52:28.55ID:8C0JMYsF
665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
2020/02/18(火) 22:18:45.81ID:ObTpNy6/
macならgnu-sedをインストールしてそっち使ったほうが良い
2020/02/19(水) 11:18:51.97ID:nP6c4IYT
痴漢の成功例っていやだなw
2020/02/19(水) 12:03:18.50ID:pMNWrift
気が付かなかったww
2020/02/21(金) 06:21:58.42ID:A/822pua
$ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?

これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
2020/02/21(金) 07:58:16.90ID:0dzJ+7kH
>>673
Bashの機能でエスケープシーケンスを解釈する
'\n'だと\nに展開されるだけだけど
$'\n'だと改行に展開される。
あと$'\u30A2'みたいにUnicode番号も指定できる。
2020/02/21(金) 14:48:04.29ID:A/822pua
>>674
そういやシングルクォートなのに改行できてるな
$ echo $'foo\nbar'も改行されるし中々便利そうだ
ありがとう
2020/02/22(土) 16:39:03.63ID:C/dFKPoq
kshのリポジトリのmasterが3400ぐらいあったコミットが13に減っていてワロタw
2020/02/25(火) 12:18:34.54ID:S19Y4jrS
grepの-eオプションみたく複数回指定できるオプション引数って
シェルスクリプトでどうやって処理するのが一般的なんかな。

getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。

そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
2020/02/25(火) 12:53:16.03ID:5KSIeSvf
出現するたびになにかやればいいだけじゃん
2020/02/25(火) 14:13:23.37ID:oSeHo6cg
>>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる

while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))

for value in "${strings[@]}"; do

done
2020/02/25(火) 15:00:07.73ID:mMwfySZI
bash依存は甘え
2020/02/25(火) 15:30:00.20ID:K+FIgRaj
>>679
ありがとう!
配列が使えるシェルならそれが一番いい方法かな。
2020/02/25(火) 15:45:41.88ID:K+FIgRaj
今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
2020/02/25(火) 17:02:15.34ID:eOOTHTW4
全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。
2020/02/25(火) 17:24:31.11ID:S19Y4jrS
>>683
コマンドライン引数の処理において
$@を使ってもいいのかな。
普通に上書きしちゃいそうな気がするが。
2020/02/25(火) 17:25:41.11ID:S19Y4jrS
サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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