X



シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 3efb-m2E0)
垢版 |
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
0791デフォルトの名無しさん (ワッチョイ e19b-IYXC)
垢版 |
2018/12/12(水) 21:07:46.42ID:7+bnD1C/0
ここかどうかわからんのだけど、メールの添付ファイルのテキストCSV部分を切り出してDB格納しようと思ったら、
シェルスクリプトでヘッダから切り出すしかない?
0793デフォルトの名無しさん (ワッチョイ f398-2dqZ)
垢版 |
2018/12/13(木) 19:34:10.52ID:Nc8J2Ufn0
>>550
別件でググっていたら、言及しているドキュメント見つけた
${1+"$@"} で動かないシェルもあるようだ

http://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html

> 最も有名なシェルの移植性の問題の一つは,`"$@"'との関連です.位置に 依存する引数が無いとき,
> POSIXでは`"$@"'を何もないことと 等価になっていますが,オリジナルのUnixバージョン7の
> Bourneシェルはその代 わりに`""'として扱い,この動作はDigital Unix 5.0のようにそれ以降の 実装でも提供されています.
>
> この移植性の問題を回避する伝統的な方法は,`${1+"$@"}'を使用する ことです.
> 残念ながら,この手法はMac OS Xでも使用されている,Zsh (3.x と 4.x)では動作しません.
> Bourneシェルをエミュレートしているとき,Zshは `${1+"$@"}'で単語の分離を実行します.
0794デフォルトの名無しさん (ワッチョイ 2364-kyah)
垢版 |
2018/12/16(日) 07:48:44.86ID:AoQUSXZn0
Bashってシングルクォートの内部でない限りバックスラッシュでシングルクオートを直接エスケープできるんだな。
マニュアルにも書いてないけど他人のスクリプト見て発見した。
$ squo=\'
$ echo $squo
'
↑こうできる。Bashは楽でいいなぁ
0797デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/17(月) 19:35:33.43ID:41bJ0tdVa
\ はエスケープだし使う事はあるので特に目新しい感じはしない。

sambaでファイルサーバ作ってWindowsからもファイルが書かれるような状況だとファイル名にスペースだの括弧だの普通に入れられてLinuxでログインしている端末からだとエスケープせざるを得なかったりする。
俺の場合はそれで一文字だけエスケープはよく使う。
0799デフォルトの名無しさん (ワッチョイ 8376-2T4x)
垢版 |
2018/12/17(月) 23:45:58.91ID:LS1nUj7m0
CUI使いとGUI使いの違いだな
CUIでわざわざくそめんどくさいスペースなんぞを好き好んでは使わない。GUIではふつーにわかりやすくもなるから使う、普通に入れるのはあたりまえ
0800デフォルトの名無しさん (ワッチョイ af03-Gl1U)
垢版 |
2018/12/17(月) 23:52:42.27ID:oCmK2PVR0
めんどくさくないけど?エアプなんキミ?
0802デフォルトの名無しさん (ワッチョイ 8376-2T4x)
垢版 |
2018/12/18(火) 00:10:28.35ID:DLVg/wUV0
>>800
めんどくさいめんどくさくないはまあ人次第だけどな
CUIでなんやかんやキーボード打ってる時に、エスケープしたり"や'囲ったり、そもそもスペースはもろもろコマンドでデリミッターだったりで、めんどくさいと思うけどな
人次第ではあるが、そゆのが想像できなずにエアプと言えるのがエアプっぽいと思わなくもない
0804デフォルトの名無しさん (ワッチョイ 069f-ez/E)
垢版 |
2018/12/18(火) 03:02:35.05ID:HuP+yDtL0
>>798
もちろんファイル名には / 以外は何でもありだが Linux だけ使ってると普通はあまりそういうファイル作らないじゃない。一々エスケープしなきゃならないしシェルスクリプトで扱いづらいし。
まあ趣味の問題ではあるけどな。
0808デフォルトの名無しさん (ワッチョイ af03-PsFA)
垢版 |
2018/12/18(火) 06:17:30.36ID:mQMHvFDr0
>>802
アルファベットや数字打つのとなんら変わらんけど?
そもそもシェルには補完ゆうもんがあるんやでエアプさんw
0809デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 09:37:03.21ID:92SsvGE7a
>>805
ああ。WindowsみたいにGUIメインで使ってるの?それだけだったら面倒じゃないかもね。
0810デフォルトの名無しさん (ワッチョイ 4676-2T4x)
垢版 |
2018/12/18(火) 10:24:35.01ID:H+ovSSRq0
>>808
なにをいいたいのかイミフすぎだな、プロフェッショナルwすぎて
補完時にもバックスラッシュ打たなきゃならんだろ?打たなくていい環境なの?そういう環境もあるんだよ
なんかただ馬鹿にしたいだけのお人か?しょうもない
0812デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 12:15:53.17ID:92SsvGE7a
Tabキー押すと自動で保管したり変換したりしてくれる場合は楽かも。
楽ってだけで見た目エスケープだらけの見辛い状態にはなるが。
0813デフォルトの名無しさん (オッペケ Sra3-Gl1U)
垢版 |
2018/12/18(火) 12:25:17.53ID:Lulkb9OFr
>>810
はいはいエアプさんはそろそろお昼寝の時間でちゅよ〜w
0815デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 15:42:44.01ID:DOEC5j1K0
こいつらプログラム言語はシェルスクリプトしか使ったこと無いんか?
シェルスクリプトは珍しく引数の文字列をクォート(もしくはダブルクォート)で
くくるのが必須じゃない言語だが他の言語は殆どクォートでくくるんだぞ

"foobar" も "foo bar" も入力のしやすさに大差ないだろ
エスケープが必要なのは \ 等であってスペースはエスケープ不要なごく普通の文字なんだが
いつものことだが(シェルスクリプト以外の)経験の差を感じるよな
0816デフォルトの名無しさん (ワッチョイ 4676-2T4x)
垢版 |
2018/12/18(火) 16:01:13.36ID:kLOm0zeN0
何をお怒りか存じませんが、括らなくてもいいから括らないのが普通になるんでございますよ。当然括るのが必須なら括るのが普通。シェルスクリプトでもスクリプトファイル書くときは変数展開では普通に括るし
コマンド叩くときにはいつも括ってるの??
0823デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 17:14:23.03ID:92SsvGE7a
WindowsだとC言語とかでパスの区切りが \ になってて毎回 \\ と入れなきゃいけないのも面倒だな。
実は / でも大丈夫だったりはするが。
0826デフォルトの名無しさん (ワッチョイ 1e81-wsuD)
垢版 |
2018/12/18(火) 17:31:06.24ID:1JLRyxNd0
パスをコマンドの引数にする必要がある場合、
例えば、hogecommand --foo_option="filepath=[パス],otheroption=bar" なんていうのがある時、
パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
シングルクォートが使えるシェルならいいが、Windowsのように使えないものもあるから、
バックスラッシュなどでエスケープしたり、コマンドが以下の様な別の区切り文字を用意していたりする。
--foo_option=[filepath="/path/with space/",otheroption=bar]

対処方法がなかなか見つからないこともあり、面倒くさいので、
自分からすすんでスペースを入れようとは思わない。
0827デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 17:46:09.05ID:DOEC5j1K0
× パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
○ コマンドの引数の形式を適当に決めると、パースするときに一工夫がいるようになってしまう。
0828デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 17:50:36.86ID:DOEC5j1K0
ちなみに気づいていないようだから言うと
>>826はパスにスペースが入っていると困る問題ではない

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

,でsplitして、○○=を消せばいいだけだから何も困らない
この例で困るのは、パスにカンマが含まれている場合であって
スペースではない
0829デフォルトの名無しさん (ワッチョイ 1e81-wsuD)
垢版 |
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で使われている。
0831デフォルトの名無しさん (ワッチョイ 2364-kyah)
垢版 |
2018/12/18(火) 18:24:29.26ID:n1+CJQ+h0
ちなみにファイル名により柔軟なのはWindowsよりも寧ろLinux(というかUnix系)だぞ。
Windowsは「con」とか「aux」とかも駄目だしバックスラッシュやコロンが含まれても駄目。
Unix系のOSは「\0(空文字)」と「/(スラッシュ)」だけが不適合で,あとは全ての文字をファイル名として
使用できる。
0836デフォルトの名無しさん (ワッチョイ af03-Gl1U)
垢版 |
2018/12/18(火) 22:59:29.33ID:mQMHvFDr0
消せるわこのエアプw
0839デフォルトの名無しさん (ワッチョイ 469f-3Kg9)
垢版 |
2018/12/19(水) 04:45:08.43ID:gf1Tua9E0
エアプってなんなん?
0841デフォルトの名無しさん (オッペケ Sra3-Gl1U)
垢版 |
2018/12/19(水) 12:42:42.59ID:guVdMf63r
>>839
おまえらの事やんw
0844デフォルトの名無しさん (ワッチョイ 2323-OVaG)
垢版 |
2018/12/22(土) 13:28:39.38ID:t1Sp89dZ0
エロ動画サーフィンで広告サイトが開いてしまったら、
デスクトップのシェルスクリプトにドラッグアンドドロップすることで
そのサイトのIPアドレスをHOSTSファイルに追加する
0846デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
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の正規表現だけでやりたい
0849デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
2018/12/23(日) 12:13:13.41ID:W0WvAA710
結局、bashの正規表現は2文字以上全置換を記述できないんですかね?
bashの正規表現でわからないことがいろいろあるんですよ。
文頭置換したいとき'^'に相当するのはどう書くかとか?
0852デフォルトの名無しさん (ワッチョイ 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 にセット
0860デフォルトの名無しさん (ワッチョイ 23b3-yIz5)
垢版 |
2018/12/23(日) 17:15:39.87ID:YhyQsVDP0
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
0865デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
2018/12/23(日) 20:36:12.95ID:W0WvAA710
>>852
ほんと感謝します
ようやくすっきりしました。
そのサイトにも行き着いていたのですが、ちゃんと読めていませんでした
ありがとうございました。

>>853
trコマンドは知ってますし、今回も使いました。
今回の処理は結局、全処理c++で書き直したりもしてるんで、
他のツール使えばできるとかの情報は全く必要なく
あくまでもbash単体で処理するにはどうするかということでここで質問しました
bashでの正規表現に関する情報があまりなくて、
20年ほど前に買ったオライリーのbash本にも正規表現の記載が一切なく
bashの正規表現に制限があるならそれを教えてもらうことも目的でここで聞きました。
0869デフォルトの名無しさん (ワッチョイ c6be-DhLY)
垢版 |
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
0872デフォルトの名無しさん (ワッチョイ c6be-DhLY)
垢版 |
2018/12/30(日) 10:40:37.85ID:btIksil/0
>>871
そうなんだよね……
もし+に特殊な処理をしないならば
tr '-+:T' ' '
で一発なんだけど、できないんだよ。
0887デフォルトの名無しさん (アウアウエー Sae3-hlMv)
垢版 |
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行目が一行目に、
みたいにトコロテンしたい
■ このスレッドは過去ログ倉庫に格納されています

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