シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトの総合スレです。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 ・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています 最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」 から参照することができます。) ・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。 http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ http://heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 □回答者への注意事項: ・シェルスクリプトでの処理方法を質問しているのに、よくわからずに 「そういうのはperl使いましょう」と回答するのはやめましょう。 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう 前スレ シェルスクリプト総合 その26 https://mevius.5ch.net/test/read.cgi/unix/1489979246/ >>428 それは元々のデータがそうであるってこと?そんなんだったら別にこのスレで話題にするようなもんじゃないだろう いつからそんなのが前提になってるねんwなんかムチャクチャぶりが...ww >>430 なんか変に絡まれてるな 全く理解できるから気にすんなw >>433 > それは元々のデータがそうであるってこと? ちょっと違うな 「元々のデータがそうであってもよい」ってこと 元々のデータ形式について指定はないのだから (処理するには効率の悪い)CSVデータでもOKだし、 どんなデータでもよい そのデータ形式も含めて、 どうしたらいいでしょうか?という話だ >>435 データの改行とそうじゃない改行をどうすんの?どうやんの? まあ、そのデータもシェルスクリプトで生成はするんだけどな シェルスクリプト1 → 何らかのデータ形式 → シェルスクリプト2 「何らかのデータ形式」のデータの中に(データ区切りの改行とは別に) 1データの値として改行等が含まれることがあるのでどうすっかなーって話 >>432 お前は>>323 を引用して > そういう解答を出してほしかった と言ってるんだろ? UnicodeはASCIIの範囲ではそれと互換なんだからUnicodeかそうじゃないかなんてどうでもいいだろうが お前が言ってるのは 「フィールド区切りにはカンマやアルメニア文字ではなくそれ専用に用意されている文字種を使いましょうね」 ってことだろ? なんか間違ってる? 「ポカーン」とするのもいいけれど、その前に文章をよく読め。脊髄反射でレスするな。 >>436 > データの改行とそうじゃない改行をどうすんの?どうやんの? そこをどうするのが質問だって〜の > Excelから出力したCSVのように一行(?)の中に改行が含まれた > データを扱うにはどうしたら良いでしょうか? って書いてあるんだろ >>437 ん?変換するんじゃないの?変換するなら別にコードがどの値とかは関係ないだろうし??ん?? >>438 > ってことだろ? なんか間違ってる? 間違ってるよ。 >>289 の案に対して置換すんなボケっていってる >>440 だから 改行コードとか\を 安全な文字に置換すんなってw また変換すんな君が出てるし。代替案を何も言わずに遅い遅いだけな。お前が遅々として進まんわっ >>442 > 初期から出てるだろ 残念 ながら出てない。 \ を安全 な文字に変 換ってことは つまりデータを 変 換すると言ってる わけだが、 データは 変換(置換)するななってのが 俺の煽ってる内容 >>435 CSVのRFCはフィールド・レコード区切りにU+001F/Eを使えなんて一言も言ってねぇぞ つーかそれこそコンマと改行が区切り文字ですよと言ってる。 そういうデータを扱うことを議論してる時に、横から偉そうな態度で 「データ区切り専用の文字があるんだから元のデータにそれを使うべき」 なんて言われてもなぁ……。 あなたは論理的思考に弱いようだからもう一度同じことを違う言い方で繰り返すと、 「前提を無視した発言は控えてください」 分かった? >>445 お前は何も進まないので、もう以後無視します >>444 代替案は >>323 ででている 俺が煽ってる内容は↓これな。おまいらに>>323 のような代替案をだせよって言ってる 326 自分:名無しさん@お腹いっぱい。[sage] 投稿日:2018/06/10(日) 08:14:53.42 >>323 正直、そういう解答を出してほしかったね。だせるかなーって思っていたけど シェルスクリプトでそういうデータを扱うなんておかしいとかのたまうばかり \x1c(ファイル分離)、\x1d(グループ分離)、\x1e(レコード分離)、\x1f(ユニット分離)は まさにそういう用途で使うもの。ここの連中の技術力の低下を感じる。 >>446 > CSVのRFCはフィールド・レコード区切りにU+001F/Eを使えなんて一言も言ってねぇぞ この期に及んでなんでまだCSVの話してんの? CSVじゃないですって何度も言ってるよね? >>448 いやいやいやいやwwダメだこりゃ なんら代替案にもなってないのだけど。なんかやけに繰り返すなwやっぱり遅々として進まんな。じゃ、お元気で >>449 お前さ&も一人さ、わざとめちゃくちゃなレスをして楽しんでるだけだろ? もうそうとしか思えない >>450 お前本当に馬鹿だなw 1データの中に改行コードが含まれてるなら、 (データの中に含まれる改行コードではなく) データの区切りの方を改行コードではなく、 そのために作られた制御文字を使うって話で 代替案になってるだろ 頭硬すぎw なんで1データを必ず改行コード区切りにしないといけないのか シェルスクリプトは1行ずつ読み取る(のが得意)ってだけで データの区切りまで改行コード区切りにする必要はない つーかこの制御文字がなぜ用意されているかに気づかんの? いやはや、ここまで言わんと理解できないのか >>424 だからやり方書いてみろよ。 出来もしないくせに煽るからバカだと言われてることに気づけよいい加減w >>455 >>422 を書いたのも俺なんですけど?w readが改行コードでぶった切られるからって、 データ区切りとする必要はありませんよねぇ(にやにや >>453 なんでそんな高圧な奴に「教えて」あげなきゃならんねんwアホか 下手くそな煽りだな >>454 > なんでこんなに荒れてんのよ 俺様がたどり着いたゴールにおまいらが どこまでたどり着けるかを試していたらこうなった >>456 ん?よくわからんな。にやけぶりがw>>422 はトラップすぎだなw >>459 トラップでも何でもないよ。 readの-dでできると言われたとき、 それbash拡張だって指摘するのが面倒だから 先に注意してあげただけ >>460 あー、そういうことか。いちおう試してみていたんだけどね。できんの? 後処理が必要ないのでそれができるのなら確かにそうだな >>460 ,461 & 遅い君 確かにできるね。っかしいなあw これができての、後処理が無駄という話なら全然それに異存はないな。変に絡んでいたらすまんかった >>461 ん? ようやく理解したのか? 煽りフェーズが終わると途端につまらなくなるなw 普通にできるし、俺はすでに近い形のものを実装している 自分の用途に合わせて最適化してるんで、汎用的にはなってないがな (その後に>>282 を質問という形でおまいらに問題を出したのだよ) 最初はデータの方をエスケープしてたんだが目に見えて遅くなってな エスケープの方式をシェルビルトインのprintfでアンエスケープ できるようにもしたが大した効果はなかった。 そこで制御文字を眺めていたら、その用途ピッタリの文字を見つけたのだよ データとしては、0x1F(US: Unit Separator)を各項目の区切り(CSVでいうカンマ相当) 0x1Eを(RS: Record Separator)を名前の通り、データ区切りとして使ってる USの方はIFSを使うことでPOSIX準拠でforなどで処理することができる さらに0x1D(GS: Group Separotor)を使えば階層構造があるデータを取り扱えるだろうし 0x1C(FS: File Separator)を使えば標準入力で複数のファイルを渡すようなこともできるだろう 便利だがそれに気づいたのは>>323 が最初。 おまいらは最初、シェルスクリプトで扱うもんじゃないとか言っていた >>323 のあともその使い道に気づかないでいた。まだまだだなw おまけで、一つだけ>>431 に補足しておいてやろう (もちろん>>431 を書いたのも俺だけどなw) > bash拡張は置換命令あるけど、 > POSIXシェルの場合、外部コマンドを呼び出す以外に > 置換命令はないんだよ。知ってる? 置換命令は無いが、fork相当のことをせずにprintfも使わずに エスケープされた文字をアンエスケープする方法はある 例えばエスケープの方式がよくある\記号を使うやり方だとして、 IFS='\' (エスケープが必要だったかも知れない)でデータをsplitして caseで n*) なら改行を表すエスケープ文字と解釈して 一文字目のnを ${STRING#?} で削除しつつ、 改行コードを一文字目に加えるという方法だ これはこれで遅くなるので却下したんだがなw 性格が歪んでるな。これ以後の質問者とかどうするとか思わないのだろうな >>466 もう人は俺がたどり着いた答えとは別の もっといい案が出るのではないかと思って 先入観を与えないために、あえて俺がたどり着いた答えを出さずに 質問の形でかいた。 しかし、俺がたどり着いた答えに辿り着く前に 諦める奴らばかりだった。情けないなw >>467 確かに。性格が歪んでるのを自覚してないようで >>470 俺tueee系の主人公は、大抵性格が歪んでるものだよw 大好物です(笑) >>472 アレと一緒にするのはマジで止めてくれ 発想が似ていたとしてもセンスがダサすぎる。 ショッカーとかアホかと たしかにリッチー大佐は酷い人格だけど間違ったことは言ってねえし しかも有用なツールを作ってから、ああいう毒を吐いてる。 上で喚いてるなんの解決策も出さず人を否定し馬鹿にすることしかできない人間と比較するのは失礼千万 誰かちょっと流れをまとめてくれ 誰が何を言いたいのかさっぱりわからん >>475 現実世界で死んだ ↓ 異世界で俺tueeeやってる >>474 > しかも有用なツールを作って なんかあったっけ? 使ったこと無いな 見た目でわかる文字列への置き換え派ですが、いにしえのエスケープコードの流用はいいアイデアだと思いました。 >>463 後で使うかもだからブログに簡単にまとめとけw 荒らした罰な >>479 俺は書かないよ。だけどこのスレを参考にして誰かが書くかもしれないね。 その場合、このスレを参考にしましたって書いても書かなっくてもいいよ 他の誰かがこことは別に思いついて書くかもしれないけどw シェルスクリプトの話題なのにスレチってどういうこと? >>482 俺はすべて分かってた。 ヒントだけ出してやったんだからありがたくいただけ。 これがスレ違い以外の何物だと... ん? シェルスクリプト総合でしょ? 質問スレじゃないし シェルスクリプトの話題で楽しめばいいじゃん? 確かにそれ専用の文字があるならそれを使ったほうがいいね。 some data␟other data␟42␞ some data␟other data␟42␞ ↑こういうの。 既にそういうフォーマットがあってもいいと思うけどざっと検索したところでは見付からない。 なにか不都合でもあるのか、単純にU+001E/Fの知名度が低すぎるのか。 ところでPOSIX awkはRsやFSに任意の文字って指定できたっけ。GNU awkではできたんだけれど。 >>486 https://www.freebsd.org/cgi/man.cgi?query=awk& ;sektion=1 あるし、STANDARDSはもとより本文でも拡張したよってのは無いからPOSIXとしてあるんじゃね つまらない点だから指摘していなかったが、 この話で U+ という表記はだめだぞ U+ というのはUnicodeの話で+の後の16進数は 文字集合におけるコードポイントだ U+001Eは符号方式がUTF-8だと0x1Eになるが、 UTF-16だと 0x00 0x1E(ビッグエンディアンの場合) もしくは 0x1E 0x00 (リトルエンディアンの場合) となる U+ だとUnicodeという文字集合を表すことになるが 符号方式がUTF-8だと決めつけることはできない あほか 最初に本データの形式仕様から制定してもいいという条件を書かないから みんな処理元のデータ形式は弄れない前提で答えてるんやん 説明不足なのに自分だけ神視点でお題気取りか 死ぬほど痛々しいわ >>490 > 最初に本データの形式仕様から制定してもいいという条件を書かないから > みんな処理元のデータ形式は弄れない前提で答えてるんやん データを加工(エスケープ)していいと書いてないのに勝手に加工してるやん? だから変えたら駄目って書いてないなら変えていいって前提で 答えてるでしょ? スレは十分伸びたからもうええやろ 何と戦ってるんや 結局特に解決や参考になるような話は出なかったね まあ今更CSVで新ネタも出ないだろう まだお前CSVって言ってんのか? そんなにCSVの話だと勘違いしていたことが ショックだったのか? 元データの上書きとバッファにコピーしての加工を同列に語っちゃうんだすげえな ていうか元データの仕様からやっていいなら最初から↓で 改行的な区切り文字を許さない仕様にすればいいだけじゃね > syori "a1" "a2" "a3" "a4" > syori "b1" "b2" "b3" "b4" > syori "c1" "c2" "c3" "c4" さんざん偉そうだが全くコードを出さないのでお察しでもういいだろう >>500 特に指定がない部分に関しては、 自由に変えていいと言ったの 改行が含まれてるとか、カンマやダブルクォートが含まれてるとかは 指定されているので、そこは変えたら駄目 当たり前だろ、ガキみたいな言い訳すんな > 自由に変えていいと言ったの 変えていいと言うか、もともと指定がないから 変えるのではなくどんなものでもOKってことだが >>502 これには同意する 変えてもいい/変えるべきなのは区切り文字。 もういい加減コードで語れ どれほど偉そうにしてもコードがアレだったらアレだし、偉そうにしてなくても素晴らしいコードはそれだけで尊敬されるだろう。後者が断然かっこいいのに いや、全然。使わないもの。それも勝手なお題のだし まあ勉強のためというのでなら、それはあるかもだが、どんなんだかだな。そもそもコードはそういうものだろうし、教えてやるって立場なんだしなw こいつもしかしてこの間の「標準入力と標準エラー出力を同時に操作したい」のアホか。 今時Python使わないでわざわざシェル使う理由って? pythonであるコマンドを実行して それを他のコマンドに流すみたいな ことが簡単にできたらね >>519 じゃあ、これ相当のことをやってみて ここまで簡潔に書ける言語をシェルスクリプト以外しらない シェルスクリプトは(特定の用途に対して)最善だから使ってるんだよ >>519 じゃあ、これ相当のことをやってみて cat /etc/password | grep /bin/bash | cut -d: -f1 (なんかブロックされたからパスワードを大文字にしてる) ここまで簡潔に書ける言語をシェルスクリプト以外しらない シェルスクリプトは(特定の用途に対して)最善だから使ってるんだよ >>520 これってどれ? ここ>>282 -以降にある記述だとてんで仕様になってないから、 仕事レベルとまではいかないまでも、 学生演習の問題として出せる程度には仕様をまとめて書いて。 あとPythonに限らずスクリプト言語はどれでも シェルにパイプ繋いで任意のシェルコマンドが実行できるから、 シェルにできてPythonでできないことなんてないよ。 勿論シェルでできないことも普通にできるし。 >>522 これは、>>521 に訂正しておいた。見れてるやろ? >>523 多分 /etc/p@ssw0rd がブロックされるんだと思う >>522 > シェルにできてPythonでできないことなんてないよ。 あるよ。 (特定の用途に対して)シェルスクリプトほどに "簡潔にできない" そりゃまあ、冗長でいいなら、アセンブラでなんでも作れますわなw 作れるか作れないかの話なんかしてない >>521 そういうのはperlやawk向きだな。 perl -F: -anle 'print $F[0] if $F[6] eq "/bin/bash"' /etc/passwd awk -F: '$7=="/bin/bash" {print $1}' /etc/passwd pythonはもっと汎用言語よりだからずっと長くなる。 こんな感じか? f = open("/etc/passwd", "r"); for l in f : c = l[:-1].split(":") if c[6] == "/bin/bash" : print(c[0]) ふだんpython書いてないからよくわからん。 専用言語がそれに向いた用途なら、汎用言語よりもコンパクトに書けるのは当たり前。 でなきゃ専用言語の存在価値がない。 でもたとえば改行もデータの一部として扱いたいみたいに向いてない用途だと 書きやすさも長さも逆転したりする。 ひとつの言語にこだわるんじゃなくて、用途に応じて言語を選択するのが UNIX流だよ。 import csv [p[0] for p in csv.reader(open('/etc/pas@wd'), delimiter=':') if p[-1] == '/bin/bash'] >>395 >>396 多分\エスケープ云々は途中でなんらか処理をする時にRFC準拠のエスケープだと不都合だからじゃないかな 「Mika says "I'm Happy"」という文を一つのフィールドとして処理するとき RFC準拠だと 「Mika says ""I'm Happy""」になるけど、例えばこれをsed(1)やらawk(1)に通したいと思ったときは 「Mika says \"I'm Happy\"」という形にしたほうが処理しやすいでしょう? そういうことなんじゃないかな。 >>528 やっぱりそのわかりにくいのが限界ですよね >>527 > でもたとえば改行もデータの一部として扱いたいみたいに向いてない用途だと > 書きやすさも長さも逆転したりする。 まだこだわってんのかw 中身がない反論(?)は惨めなだけやで? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる