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

レス数が900を超えています。1000を超えると表示できなくなるよ。
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/12/18(火) 17:50:36.86ID:DOEC5j1K0
ちなみに気づいていないようだから言うと
>>826はパスにスペースが入っていると困る問題ではない

hogecommand --foo_option="filepath=/path/with space/,otheroption=bar"

,でsplitして、○○=を消せばいいだけだから何も困らない
この例で困るのは、パスにカンマが含まれている場合であって
スペースではない
2018/12/18(火) 18:16:22.51ID:1JLRyxNd0
>>828
ああ、わるい、オプションの階層が一段階足らなかった。

hogeコマンドが、別のライブラリ(foo)のオプションを呼ぶような場合に、

hogecommand --hoge_option=foo_option="filepath=[パス],otheroption=bar"
hogecommand --hoge_option "--foo_option filepath=[パス],otheroption=bar"

こんなパターンがあって、そのままではやはりパースに一工夫が必要で面倒くさい。
ちなみに、上はmpv、下はyoutube-dlで使われている。
2018/12/18(火) 18:19:12.99ID:DOEC5j1K0
別のコマンドを呼び出すなら、別のコマンドにそのまま渡せばよかろう?

hogecommand --foo_option="どんな内容でも"

betsucommand どんな内容でも

はい。おしまい
2018/12/18(火) 18:24:29.26ID:n1+CJQ+h0
ちなみにファイル名により柔軟なのはWindowsよりも寧ろLinux(というかUnix系)だぞ。
Windowsは「con」とか「aux」とかも駄目だしバックスラッシュやコロンが含まれても駄目。
Unix系のOSは「\0(空文字)」と「/(スラッシュ)」だけが不適合で,あとは全ての文字をファイル名として
使用できる。
2018/12/18(火) 18:35:11.65ID:/rMHixhE0
開業コードもつかえるのはまれにネタになる
2018/12/18(火) 22:33:16.76ID:2j/3pVMu0
>>810
今時はWindowsのコマンドプロンプトだって必要に応じてエスケープしてくれるぞ?
2018/12/18(火) 22:34:34.10ID:2j/3pVMu0
>>831
\0も使えたと思うが...
消せなくなったりするけどさ
2018/12/18(火) 22:57:59.19ID:uKKjGArEH
>>834
消す前に作れねーだろ
836デフォルトの名無しさん (ワッチョイ af03-Gl1U)
垢版 |
2018/12/18(火) 22:59:29.33ID:mQMHvFDr0
消せるわこのエアプw
2018/12/18(火) 23:44:21.87ID:n1+CJQ+h0
名前に\0を含むファイルは作れないと思うけど。
少なくともPOSIXでは禁止されているし,http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_170
ext4でも作成できない。

……「エアプ」はどっちだろう。
2018/12/18(火) 23:56:48.31ID:DOEC5j1K0
正直ファイル名に\0が使えようが使えまいが
シェルスクリプトで\0が扱えないのでどうでもいい
839デフォルトの名無しさん (ワッチョイ 469f-3Kg9)
垢版 |
2018/12/19(水) 04:45:08.43ID:gf1Tua9E0
エアプってなんなん?
2018/12/19(水) 07:27:20.06ID:+7lasSiAM
¥x00
841デフォルトの名無しさん (オッペケ Sra3-Gl1U)
垢版 |
2018/12/19(水) 12:42:42.59ID:guVdMf63r
>>839
おまえらの事やんw
2018/12/20(木) 00:17:43.13ID:6pIAvd2J0
Airぷ
2018/12/20(木) 00:39:10.52ID:0M5ZFUn5M
for i in {0..255}; do touch "./hoge$(printf "\x$(printf "%02x" $i)")foo"; done
2018/12/22(土) 13:28:39.38ID:t1Sp89dZ0
エロ動画サーフィンで広告サイトが開いてしまったら、
デスクトップのシェルスクリプトにドラッグアンドドロップすることで
そのサイトのIPアドレスをHOSTSファイルに追加する
2018/12/22(土) 13:59:19.13ID:aa5NQG9N0
なんていうことをしていたら、hostsファイルの行数が
数千行になってしまった
2018/12/23(日) 08:08:03.20ID:W0WvAA710
sedだと簡単に動く一文字以上の半角スペースを一文字スペースに置換するコレ
echo "$strings" | sed -E 's/ {1,}/ /g'
bashだとどーしてもうまく動かず次のように[]で囲ってやるとなんとか全連続スペースじゃなく一部
だけが置換できた。
${strings// [ \{1,\}]/ }
それ以上どうしようもなかったので、次のような関数を作った
function Rep2One(){
local str=$1
local chr=$2
while :
do
str="${str//$chr$chr/$chr}"
if [[ ! $str =~ $chr$chr ]]; then
break
fi
done
echo "$str"
}

srings=`Rep2One "$strings" " "`

これで任意の2文字以上の連続を1文字に置換できたが、
sedみたいに一発でかっこよく記述できない?
至る所でbashからsedやgrep起動してたんだが、
bashのなかでできることはbashだけでやった方が大分速いことがわかったんで
なんとかbashの正規表現だけでやりたい
2018/12/23(日) 08:14:34.77ID:yUjQiXy10
なんでそんなに正規表現に拘るのかわからん

#!/bin/sh
while IFS= read -r line; do
echo $line
done

 
2018/12/23(日) 12:09:04.04ID:W0WvAA710
>>847
おお、早速
thx
単に知らなかっただけです。
任意文字の繰り返しを1文字に置換したいときはどーするんですか?
2018/12/23(日) 12:13:13.41ID:W0WvAA710
結局、bashの正規表現は2文字以上全置換を記述できないんですかね?
bashの正規表現でわからないことがいろいろあるんですよ。
文頭置換したいとき'^'に相当するのはどう書くかとか?
850デフォルトの名無しさん (ワッチョイ 9b9f-q1e7)
垢版 |
2018/12/23(日) 13:58:44.05ID:nNQ759QC0
ま、とりあえずこれでも見ろ。

bashの変数内文字列置換まとめ
https://qiita.com/aosho235/items/c36568830a8d47288284
2018/12/23(日) 14:09:56.35ID:yUjQiXy10
>>848
IFSで指定しろ
852デフォルトの名無しさん (ワッチョイ 9b9f-q1e7)
垢版 |
2018/12/23(日) 14:18:28.55ID:nNQ759QC0
でもってこれ。bash のパス名展開。

https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBG

この中に +(pattern-list) というのがある。
なので例えばこんなことも出来る。

a="a b c d" # ← 複数のスペースを適当に入れた文字列を a にセット
b="${a//+( )/ }" # ← 全ての1文字以上のスペースを1文字のスペースに変換して b にセット
2018/12/23(日) 15:08:28.31ID:eEMSqKaq0
>>848
ちょっと目的と違うかもしれんが
trコマンドの-sオプションもお勧めだよ。
POSIXで定められているので汎用性高いし、あとawkやsedを使う方法より若干高速
2018/12/23(日) 15:10:20.98ID:yUjQiXy10
外部コマンドを呼び出している以上
遅くなることに変わりはない
2018/12/23(日) 16:10:20.07ID:eEMSqKaq0
「awkやsedを使う方法より」
2018/12/23(日) 16:20:58.12ID:yUjQiXy10
「awkやsedを使う方法より若干高速
と言ったって外部コマンドを呼び出している以上
遅くなることに変わりはない」
2018/12/23(日) 16:57:53.53ID:snCJQSVKM
awkやsedより遅いの?違うでしょ?日本語勉強しなよ。
2018/12/23(日) 17:02:15.89ID:yUjQiXy10
bashだけでやるより遅いって話をしてる所に
awkやsedよりも早いって言うことに意味がないと言ってる
2018/12/23(日) 17:12:57.88ID:jos3UrGDa
まーた始まったよ(パリポリ
2018/12/23(日) 17:15:39.87ID:YhyQsVDP0
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
2018/12/23(日) 17:15:41.10ID:yUjQiXy10
しーかたないねー(パリポリ
2018/12/23(日) 17:46:37.96ID:eD9rxy9Z0
あ?やんのかこら
2018/12/23(日) 17:47:26.96ID:GvU/LsqE0
>>857
質問者の意図を汲み取りましょうw
2018/12/23(日) 20:07:54.91ID:0+7qAFFh0
今時汲み取り式なんて・・・
2018/12/23(日) 20:36:12.95ID:W0WvAA710
>>852
ほんと感謝します
ようやくすっきりしました。
そのサイトにも行き着いていたのですが、ちゃんと読めていませんでした
ありがとうございました。

>>853
trコマンドは知ってますし、今回も使いました。
今回の処理は結局、全処理c++で書き直したりもしてるんで、
他のツール使えばできるとかの情報は全く必要なく
あくまでもbash単体で処理するにはどうするかということでここで質問しました
bashでの正規表現に関する情報があまりなくて、
20年ほど前に買ったオライリーのbash本にも正規表現の記載が一切なく
bashの正規表現に制限があるならそれを教えてもらうことも目的でここで聞きました。
2018/12/26(水) 09:38:30.84ID:GigxKnwz0
watchで表示更新時間ごとに変数の加算は出来ませんか?
2018/12/26(水) 11:17:37.79ID:SKc2oSlY0
無理。自分でwatchを実装しろ
2018/12/26(水) 11:19:29.41ID:SKc2oSlY0
訂正 自分でシェルスクリプト版watchを実装しろ
2018/12/30(日) 08:42:00.02ID:btIksil/0
区切り文字を指定して文字列を分割するときに
区切り文字が一種類の場合はcut(1)とかを使うし
区切り文字がBREで表わされるような場合はAWKを使うけど
各フィールド毎に特定の区切り文字があるような時はどうすればいいかな。

今やろうとしていることはISO 8601形式の日付を空白区切りに分解することで
2018-12-30T08:36:50+09:00
↑こういう文字列を
2018 12 30 08 36 50 + 09 00
↑こういう空白区切りに分解したい。
その為には「第1,2,3フィールドはハイフン,第4フィールドは文字T,第5,6,7フィールドはコロンで分割する」
っていう具合の処理を考えないといけない。
正直,sedを使えばいいんだけど,もうちょっとスマートな方法があれば教えてほしい……。
sedだと↓
sed -n -e 's/\([[:digit:]]\{4\}\)-\([[:digit:]]\{2\}\)-\([[:digit:]]\{2\}\)T\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)\([+-]\)\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)/D:\1\2\3\4\5\6\7\8'"'"'\9/1p'
↑こんなことになるw
2018/12/30(日) 10:20:55.12ID:Ob5186rT0
>>869
入力形式が確定しているから単純化して
sed 's/[-+:T]/ /g'
とかはどう?
2018/12/30(日) 10:23:20.84ID:Ob5186rT0
>>870
書き込んでから気づいたがこれだと+の周りが処理できないな
872デフォルトの名無しさん (ワッチョイ c6be-DhLY)
垢版 |
2018/12/30(日) 10:40:37.85ID:btIksil/0
>>871
そうなんだよね……
もし+に特殊な処理をしないならば
tr '-+:T' ' '
で一発なんだけど、できないんだよ。
2018/12/30(日) 10:53:56.67ID:MMB+AHvh0
sed 's/+/ + /;s/[-:T]/ /g'
では??
2018/12/30(日) 11:01:57.94ID:/wKH6dhf0
>>869
#!/bin/sh
t="2018-12-30T08:36:50+09:00"
IFS="-T:+"
set -- $t
echo $1 $2 $3 $4 $5 $6 + $7 $8
2018/12/30(日) 11:08:31.89ID:MMB+AHvh0
タイムゾーンはマイナスありか
2018/12/30(日) 11:25:42.74ID:MMB+AHvh0
sed 's/-/ /;s/-/ /;s/\([+-]\)/ \1 /;s/[:T]/ /g'
なんか泥臭いけど
2018/12/30(日) 11:28:51.37ID:/wKH6dhf0
#!/bin/sh
t="2018-12-30T08:36:50+09:00"
IFS="-T:+"
set -- $t
case ${t%?????} in
*+) echo $1 $2 $3 $4 $5 $6 + $7 $8 ;;
*-) echo $1 $2 $3 $4 $5 $6 - $7 $8 ;;
esac
2018/12/30(日) 11:32:49.36ID:/wKH6dhf0
date -d "2018-12-30T08:36:50-09:00" "+%Y 略" (飽きた)
2018/12/30(日) 11:48:16.88ID:btIksil/0
>>874
それだとアメリカとかのタイムゾーン-03:00に対応できなくね?
2018/12/30(日) 11:49:02.96ID:btIksil/0
>>877
すまん。ちゃんと対応してくれてた。
2018/12/30(日) 16:00:37.71ID:yEx+bcWd0
GNU grep の場合

$ echo '2018-12-30T08:36:50+09:00' | grep -Po '([0-9]{2,4}|(?<=:[0-9]{2})(\+|-))' | xargs
2018/12/30(日) 16:49:11.50ID:btIksil/0
>>881
すげー。
でも後から自分でデバッグできなさそうなのでやめておくw
2018/12/30(日) 18:51:33.10ID:iF2NHAVN0
t="2018-12-30T08:36:50+09:00"
echo "${t:0:4} ${t:5:2} ${t:8:2} ${t:11:2} ${t:14:2} ${t:17:2} ${t:19:1} ${t:20:2} ${t:23:2}"
2019/01/01(火) 13:16:40.82ID:0CXB5czV0
:digit:より0-9のほうが打件数少ないのはなんなんだ
2019/01/01(火) 13:57:25.01ID:WRhsD0vEa
単に意味を優先した表現方法があるだけやろ
2019/01/05(土) 11:12:13.83ID:dE0KuiGH0
本当に一部のシステムでの話だけど
[:digit:]がロケールの数値表現にも合致する場合がある
「1」とか。
2019/01/07(月) 14:59:50.50ID:01rSRjtda
test.txtの内容が
hoge
fuga
puge

で、
sed -i -e s/hoge\n// test.txt
とやったのに『hoge(改行コード)』が消えてくれないたすけて
test.txtの一行目を削除 → 2行目が一行目に、
みたいにトコロテンしたい
2019/01/07(月) 15:08:57.37ID:01rSRjtda
自己解決・・・
sed -i -e ':a;N;$!ba;s/hoge\n//' test.txt
ってやったらできました・・何この呪文。。
2019/01/07(月) 15:30:19.88ID:RynyI9pj0
sed -i -e '/hoge/d' test.txt じゃダメなん?
2019/01/07(月) 15:36:38.32ID:01rSRjtda
>>889
で、できました
それ使っていきます ありがとうございました
891デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/07(月) 19:03:53.04ID:fnTlHl64a
grep -v もよろしく
2019/01/07(月) 19:52:44.45ID:fRqqYmWxa
一行目を消したいのかhogeを消したいのか
2019/01/07(月) 19:54:56.69ID:52D4hsE60
全部消したい。何もかも
2019/01/07(月) 20:31:04.88ID:Opohu4pM0
要らない
何も
消してしまおう
895デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/08(火) 09:33:22.38ID:LJT6VvGba
そんなあなたに rm
2019/01/10(木) 04:57:31.17ID:yVo/NDAD0
ネットワーク通信(特にhttpクライアント)に関するコマンドって
大きくwgetとcurlとfetchなんかがあるけどもみんなはなに使ってます?
大抵のLinuxにはwgetが、MacとWindowsにはcurlが初期搭載されてるので
そのどっちかだとは思う。
2019/01/10(木) 09:31:04.31ID:d7ZwxpvN0
スクリプトの場合はオプションが面倒くさくいのは関係ないから
個人的には自由度の高いcurl一択かな

直接コマンド打ってダウンロードするときはaria2cを使ったりする
898デフォルトの名無しさん (アウアウウー Sa89-JzEj)
垢版 |
2019/01/10(木) 10:00:22.11ID:jQehovm3a
昔から使ったていたというだけの理由で wget
2019/01/10(木) 11:40:29.86ID:DS8wsvUQ0
wgetが入っていればwget、curlが入っていればcurl
両方入っているなら、ファイルにしたいときはwget、出力結果を見たいときはcurl
2019/01/10(木) 16:56:41.32ID:jhx89QXs0
PowerShell では、Invoke-WebRequest のalias が、curl, wget

get-alias (gal) で表示できる
2019/01/10(木) 18:31:34.76ID:yVo/NDAD0
>>900
え、それつまり
$ curl ...
としたときのオプションは実はcurlのじゃなくて
Invoke-WebRequestに向けたオプションってこと?
そんなに互換性があるオプション体系だとは思わないのだけど
なぜエイリアスにしてあるんだろう……。
2019/01/10(木) 20:31:11.75ID:UUY7OixDM
呼ばれたときの名前によって処理を切り替えてるんじゃないの?知らんけど
2019/01/10(木) 22:34:40.34ID:qJAnpZ0RM
cURL以外使わん
2019/01/11(金) 03:35:07.12ID:tAdCcMWb0
bashで「=」という文字をコマンドにすることってできますかね。
「=」を「bc -l <<<」に割り当てて
$ = '4 / 5.1'
みたいな簡易電卓として使いたいなと思ったんだけど
alias =='bc -l <<<'やfunction = { bc -l <<< "$1" }はダメ……。
一応GNU Bashの「コマンドに使っていい文字」ではあるんだけど、使えない
2019/01/11(金) 05:36:31.36ID:YPYEBq870
=というファイル名のシェルスクリプト書いたら?
bashもいらんし

#!/bin/sh
echo "$@" | bc -l
2019/01/11(金) 08:51:55.60ID:EZ88NWNa0
function = { bc -l <<< "$1"; } ってすればできる(セミコロンが必要)
2019/01/14(月) 22:03:31.41ID:s6eFaywu0
>>906
ありがとう。
2019/01/15(火) 01:10:29.39ID:ejrN1XYw0
シェルスクリプトの練習になるオススメサイトありますか?
2019/01/15(火) 04:03:33.32ID:XDACXjEE0
水泳の練習になるオススメサイトありますか?
そう聞かれたらなんて答える?
2019/01/15(火) 07:25:22.93ID:MVbWnd0w0
いけずな野郎だな

お題があってそれを解くっていうのを練習と呼ぶなら
paizaあたりがシェルスクリプトも受け付けてたかも
2019/01/15(火) 07:38:45.50ID:1yCDbXwJ0
自分の作りたいもん作れよ、それ以上効率の良い学習方法はない
2019/01/15(火) 07:52:39.97ID:omEovS4H0
作りたいもの作れる環境がいい
2019/01/15(火) 09:04:11.62ID:ejrN1XYw0
どうもありがとうございます!
2019/01/15(火) 18:52:38.58ID:TWtv3hHM6
今からシェルスクリプトに手を出すんならPOSIX 2017の規格文書とかが
なんと無償で公開されてるので非常にやりやすいと思うよ。
GNUの日本語訳されたマニュアルでもいいし、少なくともドキュメントとしては
今は過去一番に恵まれた時代だと感じている。
915デフォルトの名無しさん (ワッチョイ ce02-H432)
垢版 |
2019/01/16(水) 17:58:43.79ID:ECRqnYoc0
一応この板にもお題スレあるけどね。
この頃過疎ってるかな。
2019/01/18(金) 08:45:17.67ID:XZjr/At96
シェルっていうかAWKのことなんですけど
今の時代に「AWKを256倍使うための本」って読んでためになりますか。
それこそFORTRAN66向けの解説書は最低でもFortran 90/95あたりを使う現在では
ほとんど役に立ちませんよね。
ですがAWKは昔からほとんど仕様が変わっていないので、
古い書籍でも役立ちそうではあります。
2019/01/18(金) 09:04:38.86ID:vsGuf730a
その本は知らんがawkは使える
2019/01/18(金) 12:00:20.35ID:hbAtvXtm0
>>916
スレチ
あるなら嫁
100円以上出す価値はない
2019/01/19(土) 01:03:50.64ID:0IErEZcU0
gawk(4以降)を使わないなら昔のawk本で勉強してもいいと思う。
2019/01/19(土) 02:01:46.56ID:fE346DRA0
256本って、役に立つことも書いてあるネタ本だろう?
勉強ってw
2019/01/19(土) 07:54:11.84ID:AOD6Gi8l0
「256倍」のAWKって,POSIX awkともちょっと違うんだよねw
だからあんまり真に受けないほうがいい
922デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 20:03:41.30ID:AuMD8hxP0
真にうけるの意味を知らんバカ、笑う
2019/01/19(土) 23:00:56.72ID:Kq2NO2td0
>>922
そういうしょうもない言いがかりでマウント取りたがる奴のほうが
今の時代みっともないと笑われがちだけどね
2019/01/19(土) 23:07:49.10ID:+IqL7b8U0
>>923
>>923
925デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 23:50:22.30ID:AuMD8hxP0
言いがかりの意味を知らんバカ、ガチ
926デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 23:51:10.14ID:AuMD8hxP0
てかバカてなんでシェルだとどおにかなると思っとるん?
2019/01/20(日) 02:31:28.62ID:2YimV45u0
↑意味不明なことを言い出し始めたぞ?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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