シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/ ) 単純な文字列置換ってどうしたら良いですかね? sedつかうとメタ文字の置換で困るんです その辺りが楽なperlでいいんじゃない? シェルスクリプトから使っちゃいけないというわけじゃないし >>147 さーせん、こんな状態なんです。 # perl -ash: perl: not found awkに正規表現じゃない文字列置換命令ってありましたっけ? >>151 perlが無いならrubyも無いでしょ はい、rubyもないし、pythonもなし、nodeもないです Ruby をインストールすれば? 漏れは、WSL で、Rubyを入れているけど >>154 残り容量600KBを切ってるので入りません Rubyは依存関係も含めると圧縮された パッケージサイズで1MB以上あります。 パターン文字列をsedで置換しちゃうとか(GNU sed の場合) $ pattern='foo[1]' $ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]' foo[2] https://paste2.org/DsfvJPn9 (こういうのをすんなりレスで書けないのはイラつく) 変なこだわりは知らん。細かくはテストはしてないけどまあ動くんじゃね >>158 スクリプトの実行はできましたが、 %s/〜/〜/g だと〜に/が入っていた時に困ります。 〜には何が入るかわかりません。 あとviは標準入力から読み込めませんでした できれば標準入力から読み込みんで標準出力に出力したいです。 ちなみにviのバージョンです # vi -H These features are available: Pattern searches with / and ? Last command repeat with . Line marking with 'x Named buffers with "x Some colon mode commands with : Settable options with ":set" Signal catching- ^C Job suspend and resume with ^Z Adapt to window re-sizes BusyBox v1.28.3 () multi-call binary. Usage: vi [OPTIONS] [FILE]... Edit FILE -c CMD Initial command to run ($EXINIT also available) -R Read-only -H List available features >>159 GNU sedじゃないからだめなんでしょうね # pattern='foo[1]' # sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]' -ash: syntax error: unexpected redirection ちなみにsedの--versionと--helpです。 # sed --version This is not GNU sed version 4.0 # sed --help BusyBox v1.28.3 () multi-call binary. Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]... or: sed [-i[SFX]] [-nrE] CMD [FILE]... -e CMD Add CMD to sed commands to be executed -f FILE Add FILE contents to sed commands to be executed -i[SFX] Edit files in-place (otherwise sends to stdout) Optionally back files up, appending SFX -n Suppress automatic printing of pattern space -r,-E Use extended regex syntax If no -e or -f, the first non-option argument is the sed command string. Remaining arguments are input files (stdin if none). >>161 ありがとうございます。動きました。 さくっとはできないもんなんですね。 >>163 ああ、bash じゃなくて ash だから here string("<<<") が使えないのね… # echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" こんな感じかな。 >>164 -v のはawk内で展開されての右辺を文字列リテラルとして処理されてえのっぽい。ので、バックスラッシュが鬼門のよう https://paste2.org/IhEG146f >>166 なんかプラスが入った時おかしいっすね GNU sed $ pattern='+' $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" foo[2] $ pattern='a+' $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" foo[2]+ busybox sed # pattern='+' # echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" sed: bad regex '\+': Repetition not preceded by valid expression >>167 う〜ん、ash でやってみたけど、1番目、2番目は問題ないなぁ Busybox の sed は -r オプションがないんじゃなかったかな あれ?でもさ、 pattern='+' $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" foo[2] 入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな? でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は `+` を考慮する必要はなかったのね… $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g" こっちの方が良いみたい。 >>171 ごめん、紛らわしかった。 そっちは正しいパターン おかしいのは「a+」の時 だから要するに + はエスケープしたらダメってことなのか? 単純な文字列置換って正規表現置換よりも簡単な処理なのに どれも面倒くさいなぁw ashの日本語manページはないのかなと思って検索した時に出てきた画面。 https://i.imgur.com/xzEhcAc.png >>176 カラフルな検索結果だがこれと言って役に立たないという共通点があるな・・・ >>177 ニヤニヤできるぞ 今更だがluaなら入ってたで grep にある -F オプションと同等のオプションが sed にも 欲しいところではあるなぁ。生まれは同じなのに sed には無い のは何故…(実はあったりして) Googleのシェルスクリプトに関するコーディング規約で 「そう〔訳注: 連続したパイプ節が二つ以下〕でない場合は一行につき一つのパイプ節を含むようにする。その際,二番目以降のパイプ節は,2文字分の欧文空白による字下げを行なう。」 とあるんだが[1],ここの例示が command1 \ | command2 \ | command3 \ | command4 となっている。 普通(といってもパイプをこのように多用しかつ改行しまくっている例はほとんど見たことがないのだが)https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/BIN/twtl.sh#L297 ↑こことかでは command1 | command2 | command3 | command4 という書き方になっている。 俺はこっちの書式のほうが見慣れているので,自分のシェルスクリプトもこういう書き方でやっているのだが,みなさんはどういう書き方がいいとかあるだろうか。あるいはGoogleとは別のところが発表してるシェルスクリプトのコーディング規約とかないだろうか。 一応俺の意見: 後者の利点としては,バックスラッシュが不要なこととコマンドが行頭に来て流れを掴みやすいということがある。 加えて簡易的なデバッグするときに,前者は command1 \ | command2 \ | cat # | command3 \ # | command4 などとするのに対して 後者は command1 | command2 | cat # command3 | # command4 このように「新しい行を挿入してcatを入力」という単純な動作ができるので,例えばVimやEmacsなどマクロが作れるエディタなどでのデバッグ用の編集に有用というのもある。 実際俺はシェルスクリプトに関してはIDEを使わずVimで開発していて,この類のマクロを作成して便利に使っている。 長文すまん [1]: http://google.github.io/styleguide/shell.xml#Pipelines 簡易的なデバッグするときに前者は command1 \ | command2 \ # | command3 \ # | command4 などとするのに対して 後者は command1 | command2 | # command3 | # command4 のように行頭に#をいれるだけではSyntax errorになるから前者の方がデバッグなど編集に有用とも言える 個人的には大差ないと思う 末尾にバックスラッシュを入れることで次行を見なくても明確にコマンドが続くことがわかるから前者を支持する >>184 でも>>183 のように,コメントアウトすると 「末尾にバックスラッシュがあっても後ろにコマンドがない(実行されない)」 という状況がありえる以上, 末尾のバックスラッシュの有無を過信するのはよくないと思う。 もちろん気をつければいい話だが。 なんというか,ハンガリアン記法の間違って流布された方法に近しい危険性がある (変数i_VARを見て,本当はfloat型なのにint型だと思い込む) ていうか少なくとも二人くらいは 後者の方式に賛同してるのか。 Googleもそっちを推奨してるし,俺も手癖を直すべきなのかな。 >>184 それ、末尾にパイプ記号あるから〜 と同じことじゃね? 個人的には見栄え的には前者の方を採用したいが余計な継続記号が不要な後者で書いてる バックスラッシュで行継続(改行)って多くの言語で採用されているから 多くの人はパイプ先頭、バックスラッシュ行末じゃないかな? 俺は1行か2行くらいなら後者だな。 何行もずらずら並べるなら中括弧で囲んでパイプ記号を先頭に持ってくるかも。 行末にバックスラッシュを置いて行継続はあまり美しくないと思うのでなるべく書きたくない。 >>191 構文的に行末で文(言語によっては式)が完結できていれば行末を文の終わりとみなし そうでなければ次の行に継続、というのもshそのものをはじめpython, JavaScriptなど多くの言語で採用されているよ。 (pythonはshと同じく行末バックスラッシュで継続もできるが) 更にRubyは行の終わりで完結できるように見えても次の行の先頭を見てどうするか決めていたりする。 >>190 無知ながら初耳だった。 scshの説明をざっと読んだけど、今回の問題の解決になる? むしろ「括弧の前で改行するかいなか」みたいな新たな規約が生まれそうじゃない? シェルスクリプトの話題からちょっと外れるんだけど $ somecmd --help としたときの手引きって標準エラー出力に出力すべき? GNU Coreutilsでは基本的に標準出力なんだけど……。 stderr だとページャにつなげたい時に $ somecmd --help 2>&1 | $PAGER とかするのが面倒。でも zsh とかだとエイリアスで どうにかできるんだっけ? >>196 $ somecmd --help |& $PAGER ↑これでいいんでは >>198 dクス、"|&" が使えるのは bash と zsh だけかな >>199 あ ごめん。それPOSIX互換じゃねえわ 知らんまにbash主義に染まってた 反省。 csh由来のものをbashismというのはどうかと…… まあ>>201 はそんな大層な意味で言ってるわけではないだろ。単にbashしか使ってない使い込んでるってだけの意味だろう。無知でしたという --helpで思い出したけど、あれって書き方ってあるの? usageの書き方とかオプションの書き方とか 引数は大文字にするの?とか [ファイル]... とかの[] とか ... の使い方とか あるようで、バラバラな気もしている >>205 とりあえず 天下のPOSIX様はこうおっしゃってる utility_name[-a][-b][-c option_argument] [-d|-e][-f[option_argument]][operand...] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_01 ので 俺はそれに従ってる。だいたいのmanページやGNUユーティリティの--help出力もこれに準ずる形だと思うよ >>206 多分>>205 はそういうのを求めてたんじゃないな シェルスクリプトの言語にJavaScriptってアリだと思う? #! /usr/local/bin/js24 みたいなシェバンでさ。 シェルスクリプトっていうのは シェルとして実用に堪えるものじゃないとダメ 名前の通り コマンドを呼び出すのに、いちいちsystem関数を 使うとかいうのは、シェルとして使えない ls だけでlsコマンドを実行できるようにしたら シェルスクリプトと認めてもいいが シェルスクリプトというより、他のインタプリタ言語と同じようにコマンド(内容)記述用としてあっていいって話だろう 普通にやるだろ。 #!/usr/bin/awk -f とかだってたまにはやるぞ。 「#」がコメント扱いになる言語なら 気にせずどんどんやればいい。 そもそもshebangはUNIX上で「スクリプト言語」を呼び出す時の記法であって 現代UNIXではシェルは一切関与しないカーネルの機能だから 「シェルスクリプト」なんかじゃない。 (つまり実はスレ違い) なお昔のSystem-V系UNIXにはカーネルにこの機能がなくexec(2)が失敗するので、 その場合にはシェルが代行してスクリプトのインタープリターをよびだしていた。 そういうUNIXはほぼ滅びたけどシェル側にはまだこの代行機能が残っていたりする。 シェルは関与しないのにshell-bangなんて変な名前だけど、 この言い方自体比較的新しくて、実装されてからだいぶ長い間名前がなかったんだよ。 普通はカーネルが処理しててシェルは関係ないってことを 知らない奴がつけた名前じゃないかと前から疑問に思ってる。 >>212 > 普通にやるだろ。 > #!/usr/bin/awk -f > とかだってたまにはやるぞ。 落ち着け それはスクリプト言語だ "シェル"スクリプト言語ではない > シェルは関与しないのにshell-bangなんて変な名前だけど、 shebang を shell-bangの略だと主張する人は少数派だよ >>208 それはシェルスクリプトじゃなく、 JavaScriptスクリプトだ スクリプト スクリプトスクリプト スクリプトスクリプトスクリプト スクリプトスクリプトスクリプトスクリプト 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) >>213 落ち着け。 もうちょっと先まで読めば同じことが書いてあるぞw >>214 shebang の e って何から来てるの? 俺は shell から来てるんだと思ってた。 なお shabang という書き方も少数派だが使われてはいるみたい。 実際 sharp-bang なわけで、こっちなら分かる。 shabang ならシバンじゃなくて、シャバンだよな。 シャバ〜ン。 なんつーかオッサンばっかだな。 まあ俺もそういう反応を期待してたわけだがw >>219 #! -> sharp-bang -> shabang -> 単語ならshellだしすでにあるとても似たshebangでいいんじゃね、shebangの意味自体が似合ってるし とか。shebangというれっきとした単語の由来は別にある 元ネタ分かんねーと思ったらおっさんどころかジジイじゃねーか マジで検索しても元ネタわからんw 平均年齢どのくらいだこのスレは >>232 >>227 が元ネタ。 ギャバン/シャリバンのバンと、シャリバン/シャイダーのシャと、 ギャバンのオープニング末尾のギャーバーン♪ からの連想でシャーバンと書いた。 残りは歌詞検索とかすると分かる。 こんな連想するの俺だけかと思ったら他にも複数いてワラタ >>234 男なんだろ? の一言でギャバンOPテーマとわかるのはギャバン世代というよりもFLASH黄金世代な予感 実際俺はギャバンじゃなく当時の面白FLASHギャバソで知った >>235 そんなFLASHがあったのか。 4月のAnisonDaysに串田アキラが出てギャバンのOPを歌ってたから、 それで記憶が蘇ってる人もいるかも。 てゆうかそれ俺。 そして>>228 の癒着というのはケロロ軍曹の登場人物 556(コゴロー)が変身するときのセリフ 元ネタはギャバンが変身するときに言うセリフの蒸着 40代ならここまで連想する 蒸着の元ネタってギャバンだったのか… DeadSpaceのアーマー更新シーンを蒸着言うやついたけど元ネタあったんだな >>237 あ それなら知ってるわ ケロロ軍曹だったら子供のころアニメで観てた バッチファイルやパワーシェルもシェルスクリプトですか? 何言語っていうんでしょうか? >>241 バッチファイルはシェルスクリプトには入れないなあ。 PowerShellの方は、PowerShellスクリプトって言うな俺は。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる