シェルスクリプト総合 その25at UNIX
シェルスクリプト総合 その25 - 暇つぶし2ch927:名無しさん@お腹いっぱい。
17/02/15 01:22:16.71 .net
そんで戻ってこない文字が出てきて泣きそうになるまでがテンプレだね。

928:名無しさん@お腹いっぱい。
17/02/15 01:34:33.21 .net
それでもiconvなら
iconvならきっとなんとかしてくれる

929:名無しさん@お腹いっぱい。
17/02/15 04:53:01.40 .net
元がcp932なら変換不能になることはないだろう
そう、iconvならね

930:名無しさん@お腹いっぱい。
17/02/18 04:37:58.77 .net
#!/bin/bash
echo A > test.txt ; echo B >> test.txt
ARRAY=$(cat test.txt)
for item in ${ARRAY[@]}; do
echo $item
done
としたら
A
B
と表示されるので、$ARRAYは 2個の要素を持つ配列になったのだと思っていました。

ところが要素数を
echo ${#ARRAY[@]}
で表示させたら 1 が表示されます。

$ARRAYは配列になっていないのでしょうか?
だとすると、なぜ for item … で表示されたのか?

931:名無しさん@お腹いっぱい。
17/02/18 04:55:39.09 .net
indexも表示させればわかるよ

echo A > test.txt; echo B >> test.txt

ARRAY=$(cat /tmp/test.txt)
for (( i=0; i<${#ARRAY[@]}; i++ )) do
printf "ARRAY index:%d value:%s\n" "$i" "${ARRAY[i]}"
done

readarray -t ARRAY2 < <(cat /tmp/test.txt)
for (( i=0; i<${#ARRAY2[@]}; i++ )) do
printf "ARRAY2 index:%d value:%s\n" "$i" "${ARRAY2[i]}"
done

932:名無しさん@お腹いっぱい。
17/02/18 05:52:55.03 .net
>>914
readarray -t ARRAY < <(cat test.txt)
で綺麗に配列として読まれますね。
これでいま作っている自作ツールが完成出来ます。
ありがとうございます

933:名無しさん@お腹いっぱい。
17/02/18 09:43:20.54 .net
最初の例のやつ、多分配列になってないんじゃないか

934:名無しさん@お腹いっぱい。
17/02/18 14:18:47.86 .net
>>916
#!/bin/bash
echo A > test.txt ; echo B >> test.txt
ARRAY=$(cat test.txt)
N=1
for item in ${ARRAY[@]}; do
echo ARRAY[$N]=$item
N=$(($N + 1))
done

としたら
ARRAY[1]=A
ARRAY[2]=B
と表示されて、配列になっているようです

935:名無しさん@お腹いっぱい。
17/02/18 16:02:36.82 .net
>>917
それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ
echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい
for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ?

あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫
readarray -t ARRAY < test.txt

while readするかreadarray(=mapfile)使うか
URLリンク(mywiki.wooledge.org)

936:名無しさん@お腹いっぱい。
17/02/18 17:07:28.86 .net
>>918
> それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ
> for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ?

なるほど。
配列になっていないのと、検証の方法が間違っていたことがよく理解出来ました。

> echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい

気を付けます。

> あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫
> readarray -t ARRAY < test.txt
> while readするかreadarray(=mapfile)使うか
> URLリンク(mywiki.wooledge.org)

ありがとうございます。
もっと勉強します

937:名無しさん@お腹いっぱい。
17/02/20 13:16:49.47 .net
>>919
[user@f25 ~]$ ARRAY=$(cat test.txt)
[user@f25 ~]$ declare -p ARRAY
declare -- ARRAY="A
B"
[user@f25 ~]$ readarray -t ARRAY < test.txt
[user@f25 ~]$ declare -p ARRAY
declare -a ARRAY='([0]="A" [1]="B")'

938:名無しさん@お腹いっぱい。
17/02/20 18:00:26.41 .net
>>920
declare -p !!!
知らなんだ

939:名無しさん@お腹いっぱい。
17/02/20 18:11:16.14 .net
このスレ来ると度々便利な知識得られるからいいわ
grep -oとか

940:名無しさん@お腹いっぱい。
17/02/21 05:20:06.32 .net
配列にするなら
ARRAY=( $(cat test.txt) )

941:名無しさん@お腹いっぱい。
17/02/21 16:45:06.28 .net
>>923
echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると…

942:名無しさん@お腹いっぱい。
17/02/21 19:03:20.01 .net
IFS=$'\n'
ARRAY=( $(cat test.txt) )
declare -p ARRAY

とすれば空白混じりの行も1行として扱われるが、
空行(何も文字が無い行)は$ARRAYに読み込まれない

readarray -t ARRAY < test.txt
declare -p ARRAY

だと空行も読み込んでくれる

943:名無しさん@お腹いっぱい。
17/02/28 23:57:54.64 .net
echo test | grep a
みたいな時に終了コードはgrepこの場合1
でかつ標準出力にはtestが出ていて欲しいのですが

どうしたらいいでしょうか?
環境はbashです

944:名無しさん@お腹いっぱい。
17/03/01 00:40:42.45 .net
echo test | tee /dev/tty | grep a

でどうだろう?

945:名無しさん@お腹いっぱい。
17/03/01 00:57:07.01 .net
終了コード1のときにはその文字列を表示したいとかによって違う気がする。
常に入力をそのまま出力していいのだろうか。

946:名無しさん@お腹いっぱい。
17/03/01 01:36:33.88 .net
仕様を細かく詰めてない気がするけど とりあえず
echo test | ( grep -v a; exit $(expr \( "$?" + 1 \) % 2 ))

947:名無しさん@お腹いっぱい。
17/03/01 02:35:11.20 .net
みなさん、ありがとうございます

echo の部分は常に表示、grepは結果のみ欲しいので-qで、判定につかうインプットは常に全量表示して、結果はリターンコード、標準出力は人が見るよう、リターコードはその後のシステム的な分岐につかう的な目的です(後続はbashの世界でないのでワンライナーが嬉しい)

948:名無しさん@お腹いっぱい。
17/03/01 05:09:32.29 .net
macのsipsコマンドについて質問しても大丈夫ですか?
例えば-zと-sを一緒に実行して--out でフォルダに書き出したいとして
どういうルールで並べて記述すればいいでしょうか?

sips -Z 200 * -s format jpeg --out Converted/
あれこれいじって、たまたまこれで動いたのですが
正しいのかわかりません。
よろしくお願いします。スレチだったらすいません。

949:名無しさん@お腹いっぱい。
17/03/01 09:20:45.49 .net
>>930
grep にこだわらくても良くて、GNU sed を使ってもいい場合:

$ echo test | sed '/a/!q1'
test
$ echo $?
1

950:名無しさん@お腹いっぱい。
17/03/01 09:22:21.87 .net
>>931
正しいけどスレチ
man見ろ
見られないんなら
URLリンク(developer.apple.com)

951:名無しさん@お腹いっぱい。
17/03/01 09:41:41.92 .net
要求満たしつつ個人的に好きなのは>>927

952:名無しさん@お腹いっぱい。
17/03/01 09:50:14.78 .net
「標準出力」じゃないから要求満たしてないんじゃない?

953:名無しさん@お腹いっぱい。
17/03/01 10:04:09.41 .net
>>931
そういえばこういうスレもあったり
【Macintosh】MacでUNIX【Terminal】
スレリンク(unix板)

mac板でよかった気もするけど
OS XをUnixとして使ってる人の為のスレ 18
スレリンク(mac板)

954:名無しさん@お腹いっぱい。
17/03/01 10:17:52.51 .net
>>932
あ、間違えた…こうしないと

$ echo test | sed -n 'p;/a/H;${x;/./q0;q1}'

955:名無しさん@お腹いっぱい。
17/03/01 12:19:32.48 .net
echo test | awk '/a/{x=1}//END{exit !x}'

956:名無しさん@お腹いっぱい。
17/03/01 17:16:16.75 .net
$ echo test | awk '/a/{x=1}{print}END{exit !x}'

じゃないの?

957:名無しさん@お腹いっぱい。
17/03/01 17:36:55.41 .net
$ echo test | grep -B10000 -A10000 a

958:名無しさん@お腹いっぱい。
17/03/01 17:38:08.89 .net
あああ、1行もマッチしないとダメだ

959:名無しさん@お腹いっぱい。
17/03/01 21:54:56.86 .net
>>933 >>936
スレチにもかかわらずありがとうございました!

960:名無しさん@お腹いっぱい。
17/03/04 09:13:31.42 .net
>>931
うちでもよく使うが、sips なんて他には無いからな

for i *.jpg; do sips -Z 200 $i -s format jpeg --out Converted/$i; done

ところでマカーな人はbash4入れてるんですかね。bash3なので、最近ココで出てくるreadarrayが使えない

961:名無しさん@お腹いっぱい。
17/03/04 09:17:20.48 .net
あー in が抜けてる
for i in *.jpg ; do な

962:名無しさん@お腹いっぱい。
17/03/04 10:32:40.92 .net
ImageMagickのconvertみたいなものか

963:名無しさん@お腹いっぱい。
17/03/04 18:32:17.60 .net
>>943
>ところでマカーな人はbash4入れてるんですかね。

Homebrewで入れてそっち使うようにしてる

964:名無しさん@お腹いっぱい。
17/03/07 19:02:41.56 .net
いつもシェルが使える環境ある?
自分は仕事ならcygwin(今は使ってない)、実機、仮想環境
プライベートならラズパイ、仮想環境かな

965:名無しさん@お腹いっぱい。
17/03/07 22:43:56.07 .net
Mac

966:名無しさん@お腹いっぱい。
17/03/07 23:30:24.96 .net
俺はスマホにzsh入れてるけど

967:名無しさん@お腹いっぱい。
17/03/08 01:50:34.93 .net
>>947
SL-Zaurus(SL-C860)を今だに現役で使っているよ

968:名無しさん@お腹いっぱい。
17/03/09 02:31:23.57 .net
そういうのって
ただ書けるだけじゃなくて動かせたり
実際にその機械で便利に使えたりするのですか?

969:名無しさん@お腹いっぱい。
17/03/09 17:50:34.83 .net
pythonの出力をシェルの変数にするにはどうやれできますか?

x=$( python test.py )
はダメでした

970:名無しさん@お腹いっぱい。
17/03/09 17:58:17.55 .net
$ cat test.py
print("Hello world!")
$ python test.py
Hello world!
$ x=$(python test.py)
$ echo $x
Hello world!

971:名無しさん@お腹いっぱい。
17/03/10 09:16:11.80 .net
あれ?そうだよなと思ったら、pythonの文字コードの扱いが変でした
シェルごめんよ

972:名無しさん@お腹いっぱい。
17/03/10 13:07:41.33 .net
pythonのせいにするのもどうかと

973:名無しさん@お腹いっぱい。
17/03/10 16:08:16.57 .net
pythonは文字コード周り落とし穴が多いすぎ
pythonのせい

974:名無しさん@お腹いっぱい。
17/03/11 22:32:29.75 .net
$@から$1を除いたものを関数に渡す方法を教えてくだしあ

975:名無しさん@お腹いっぱい。
17/03/11 22:46:42.79 .net
shiftするしかないんじゃないかな
呼出し後に元に戻したいとするとsetかな

976:名無しさん@お腹いっぱい。
17/03/11 23:06:24.73 .net
呼び出し先でshiftすりゃいいじゃん

977:名無しさん@お腹いっぱい。
17/03/12 00:12:25.14 .net
せやな!

978:名無しさん@お腹いっぱい。
17/03/12 01:47:16.95 .net
>>957
bash なら "${@:2}" でええんちゃう

979:名無しさん@お腹いっぱい。
17/03/12 04:14:35.39 .net
>>961
その発想もなかった
パラメータとして渡すならこっちの方が分かりやすいな

980:名無しさん@お腹いっぱい。
17/03/12 19:17:36.56 .net
ずっと、行の抜き出しはprcegrepを使ってたげど
sed -n -e '/hoge1/,/hoge2/p'
これでできるのを、今知って感動中。しかも、こっちの方が速い。
そのあとの置換は
sed -n -e '/hoge1/,/hoge2/p' | sed -e 's/foo/bar/g'
としかできなかったけど
sed -n -e '/hoge1/,/hoge2/p' -e 's/foo/bar/g'
で、やる方法とかであるんですか?

981:名無しさん@お腹いっぱい。
17/03/12 20:09:10.06 .net
sed -n -e 's/foo/bar/g' -e '/hoge1/,/hoge2/p'
じゃだめなの?

982:名無しさん@お腹いっぱい。
17/03/12 20:49:35.74 .net
sed -ne '/hoge1/,/hoge2/{s/foo/bar/g;p;}'
でもいけそう

983:名無しさん@お腹いっぱい。
17/03/13 15:22:55.40 .net
sedスレあるのに忘れられてそうw

984:名無しさん@お腹いっぱい。
17/03/13 17:19:42.05 .net
sed -e '/hoge1/,/hoge2/!d' -e 's/foo/bar/g'

985:名無しさん@お腹いっぱい。
17/03/13 19:49:20.42 .net
ありがとうございます
さらに速くなりました

一番最後の文字はコマンドというのを実感

986:名無しさん@お腹いっぱい。
17/03/13 20:38:32.02 .net
sedは-n使ったら負け

987:名無しさん@お腹いっぱい。
17/03/15 13:36:43.93 .net
なんで?

988:名無しさん@お腹いっぱい。
17/03/15 13:37:42.13 .net
うるさい!
俺が負けだって言ったら負けなんだよ
大人しく言う事聞け

989:名無しさん@お腹いっぱい。
17/03/15 13:43:38.36 .net
なんだそのダメな親みたいな言い分は

990:名無しさん@お腹いっぱい。
17/03/15 13:45:42.22 .net
むしろジャイアンかな

991:名無しさん@お腹いっぱい。
17/03/15 16:27:57.38 .net
pでプリントした行は元質問にもあるようにストリームを流れて行かない、
お漏らししたようなものだからね

992:名無しさん@お腹いっぱい。
17/03/15 18:03:51.07 .net
sed だと、後方参照の時にバックスラッシュでエスケープしまくることになるのがどうにも…
それで、いつの間にか perl を代わりに使うようになった。

993:名無しさん@お腹いっぱい。
17/03/15 19:02:59.32 .net
sedでできることをperlでやるのは微妙に悔しいw

994:名無しさん@お腹いっぱい。
17/03/15 20:28:01.98 .net
sed -e "s/微妙に/非常に/" >976

995:名無しさん@お腹いっぱい。
17/03/15 20:45:20.13 .net
入力なくね?

996:名無しさん@お腹いっぱい。
17/03/15 20:58:18.06 .net
考えすぎ

997:名無しさん@お腹いっぱい。
17/03/16 12:44:27.48 .net
>>978
sed -e "s/微妙に/非常に/" <975 >976
ってやって空のファイルを作ってしまったあの頃...

998:名無しさん@お腹いっぱい。
17/03/16 12:47:16.46 .net
分からんでもない

999:名無しさん@お腹いっぱい。
17/03/16 16:23:09.20 .net
最初に head/tail、grep、sort 辺りを処理の都合上先にやることが多いので、
sed の入力にはパイプを使うことが多いかな。

1000:名無しさん@お腹いっぱい。
17/03/16 22:48:37.43 .net
日本語下手かw

1001:名無しさん@お腹いっぱい。
17/03/18 22:25:35.75 .net
grepしてsedは素人

1002:名無しさん@お腹いっぱい。
17/03/18 23:27:17.30 .net
なんで?

1003:名無しさん@お腹いっぱい。
17/03/19 00:04:19.09 .net
sedだけでできるからかと

1004:名無しさん@お腹いっぱい。
17/03/19 00:24:39.59 .net
grepである程度簡単なワードで絞ってからのほうが、複雑な置換は早そうだけど

1005:名無しさん@お腹いっぱい。
17/03/19 00:57:36.33 .net
実験して見せられるまで性能に関する予想は信じない

1006:名無しさん@お腹いっぱい。
17/03/19 01:06:54.08 .net
まぁこじらせた人にてみればその手間は実に腹立つだろうな

1007:名無しさん@お腹いっぱい。
17/03/19 10:07:51.17 .net
「ひとつのことを上手くやる」から考えると、grep してから sed の方がマッチしてそう

1008:名無しさん@お腹いっぱい。
17/03/19 11:41:33.99 .net
windowsのdos窓は使えるけれど、grep、sed、awk、perlなどはなし。当然他のスクリプト言語もなし。
さらに、新たなソフトのインスコはできない。
まあ、notepadでソースの編集はできる。

Eドライブには多くのフォルダがあって、中にはjpegのえろ画像が1テラ分てんこ盛り
えろ画像だけを全部Dドライブにコピーしたい。
Eドライブのフォルダを見ると8階層ぐらいのフォルダもあって、とても手作業のコピペはムリ。

にゃんとか目的を達成する方法はないであろうか?!
各位のお知恵を拝借したい。

1009:名無しさん@お腹いっぱい。
17/03/19 13:00:13.49 .net
powershell でも使えばいいんじゃないかな

1010:名無しさん@お腹いっぱい。
17/03/19 14:12:15.82 .net
ここじゃなくてもっと他に聞くべき所があるだろうな

1011:名無しさん@お腹いっぱい。
17/03/19 20:18:27.47 .net
その環境的な制限がありつつ、エロ画像を扱うという状況が想像できないな
仕事でエロ画像を扱ってるか上司の個人環境とかかな

1012:名無しさん@お腹いっぱい。
17/03/19 20:31:39.22 .net
robocopyでコピーすれば良い

1013:名無しさん@お腹いっぱい。
17/03/19 20:55:37.07 .net
>>988
GNU grep + GNU awk の場合だけど、GNU awk単独よりも早いらしいぞ
URLリンク(papiro.hatenablog.jp)

1014:名無しさん@お腹いっぱい。
17/03/19 22:03:55.18 .net
ドライブを別のPCからアクセス可能にしたらいいのに

1015:名無しさん@お腹いっぱい。
17/03/19 23:09:48.69 .net
>>996
timeの使い方を知らないって事を自慢してどうしたいんだ?

1016:名無しさん@お腹いっぱい。
17/03/19 23:10:46.82 .net
エロ画像に寛容なUNIX板

1017:名無しさん@お腹いっぱい。
17/03/20 10:44:19.74 .net
>>994
昔社内から netnews が見れてたので perl でスクリプト組んでエロ画像落としまくってたのをふと思い出した
当時は普通にFDに移動して持ち帰ってたけど

1018:名無しさん@お腹いっぱい。
17/03/20 12:06:05.49 .net
俺にはもうFDってのがもうすごいわ

1019:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch