シェルスクリプト総合 その24©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0395前スレ119
2015/03/11(水) 19:13:00.82同じtree.txt中に混在している状況です。
数字の部分も
01_{01..07} #(実際は7行ある)、
...
04_{01..04} #(これも4行ある)
になっているブロックもあったりしてかなりヤヤコシイのですが、
[(連番になっている数字)以外のところが同じ行]を検出して数字を{}でまとめたい感じです。
3000行あって手作業は泣きそうなので、エレガントな方法をご教授いただければ幸いです。
{01..04}_{01..07}とする必要は無いです。
よろしくお願いします。
0396名無しさん@お腹いっぱい。
2015/03/11(水) 19:16:18.160397名無しさん@お腹いっぱい。
2015/03/11(水) 19:54:30.560398名無しさん@お腹いっぱい。
2015/03/11(水) 20:19:19.48何で書くの(´・ω・`)?
0399名無しさん@お腹いっぱい。
2015/03/11(水) 20:27:02.770400名無しさん@お腹いっぱい。
2015/03/11(水) 20:48:55.55ご自分が言っているように、まず
>[(連番になっている数字)以外のところが同じ行]を検出して
これをする。たとえば次のように
sed -e 's/_[0-9][0-9]_/_%%_/' tree.txt | sort | uniq
これで「連番になっている数字以外のところが同じ行」をパターン化できる
そしたら、そのそれぞれのパターンで grep tree.txt して、sort -n し、
head -n 1 と tail -n 1 で連番の最初と最後の値を切り出す
こんな感じで行けないかな
0401名無しさん@お腹いっぱい。
2015/03/11(水) 20:58:26.700402名無しさん@お腹いっぱい。
2015/03/11(水) 23:14:35.24問題が全然理解出来ない
誰か問題を解説してくれ
0403名無しさん@お腹いっぱい。
2015/03/11(水) 23:20:28.51日本の植民地支配から、
日本が勝手に領有権を主張しだした。
現在は国際的にも韓国領と認識されている。
0404名無しさん@お腹いっぱい。
2015/03/11(水) 23:54:15.140405名無しさん@お腹いっぱい。
2015/03/12(木) 00:03:26.060406名無しさん@お腹いっぱい。
2015/03/12(木) 01:56:20.20やつらの主張の誤りは、独島=竹島だと言張ってるところ。
独島は竹島だとは別の島だよ。
0407名無しさん@お腹いっぱい。
2015/03/12(木) 02:02:58.540408名無しさん@お腹いっぱい。
2015/03/12(木) 02:46:00.10Bashのブレース展開の逆がやりたいってことかと
0409名無しさん@お腹いっぱい。
2015/03/12(木) 03:03:37.86http://search.cpan.org/~vvu/Compress-BraceExpansion-0.1.7/lib/Compress/BraceExpansion.pm
てのがあった
このままじゃ使いものにならんけどね
0410名無しさん@お腹いっぱい。
2015/03/12(木) 16:01:30.66テキストファイルを検索して見つけた行数を取得したいときって
grep -nで行数出力させて取得するのが一番シンプルかな?
マッチする最終行にしたい場合はtailと組み合わせてさ
ちなみにシェル知らなかったころってreadで1行ずつ読み込んで判断してたw
0411名無しさん@お腹いっぱい。
2015/03/12(木) 16:32:34.700412名無しさん@お腹いっぱい。
2015/03/12(木) 18:00:51.55grep -c
0413名無しさん@お腹いっぱい。
2015/03/12(木) 18:40:40.82オマエいつも問題の意味取り違えて回答して点数もらえないタイプだろw
0414名無しさん@お腹いっぱい。
2015/03/12(木) 20:35:27.12ん?
質問:検索して見つけた行数を取得したい
cオプション: 検索条件にマッチした行数を表示する
0415名無しさん@お腹いっぱい。
2015/03/12(木) 20:36:26.22あ、わかった
質問は行番号のことを行数といっているのね
0416名無しさん@お腹いっぱい。
2015/03/12(木) 20:36:37.62まだわかってないのか…重症?
0417名無しさん@お腹いっぱい。
2015/03/12(木) 21:26:36.040418名無しさん@お腹いっぱい。
2015/03/12(木) 22:07:04.23オプションなしだと複数返すコマンドだよね
0419名無しさん@お腹いっぱい。
2015/03/13(金) 00:23:15.74日本語に不自由してるのぅ
0420名無しさん@お腹いっぱい。
2015/03/13(金) 01:03:30.380421名無しさん@お腹いっぱい。
2015/03/13(金) 01:16:54.86>grep -nで行数出力させて取得するのが一番シンプルかな?
>マッチする最終行にしたい場合はtailと組み合わせてさ
これから察するに、行数と書いてはいるが、実際は行数じゃなくて行番号のこと言ってるんじゃないの?
マッチした行数が知りたいなら最終行の話なんて出てこないだろ
つまり本当にバカなのは>>416と推測
まぁ質問主から続きがなければ有耶無耶だが
0422421
2015/03/13(金) 01:17:57.58すまん眠かったってことで何も見なかったことにしてくれ……死ぬ……
0423名無しさん@お腹いっぱい。
2015/03/13(金) 04:43:04.000424名無しさん@お腹いっぱい。
2015/03/13(金) 07:28:39.510425名無しさん@お腹いっぱい。
2015/03/13(金) 07:40:15.74natural number = 自然数
complex number = 複素数
number = 数
0426名無しさん@お腹いっぱい。
2015/03/13(金) 08:04:07.16ちがう。
0427名無しさん@お腹いっぱい。
2015/03/13(金) 08:20:54.530428名無しさん@お腹いっぱい。
2015/03/13(金) 11:04:35.040429名無しさん@お腹いっぱい。
2015/03/13(金) 13:12:27.060430名無しさん@お腹いっぱい。
2015/03/13(金) 17:11:36.570431名無しさん@お腹いっぱい。
2015/03/14(土) 01:06:12.05Fランもたいがいにせいよ
0432名無しさん@お腹いっぱい。
2015/03/14(土) 02:26:16.92まあgrepでいいと思う
grep -n regexp FILE | tail -n1 | cut -d: -f1
awk /regexp/'{print NR}' FILE | tail -n1
sed -n /regexp/= FILE | tail -n1
0433名無しさん@お腹いっぱい。
2015/03/14(土) 04:57:44.74行数は line count (だからこそ grep -c )
0434名無しさん@お腹いっぱい。
2015/03/14(土) 05:17:25.87てかどーでもいいよ
行数にしろ行番号にしろ質問者が具体例を明示してる時点で誤解しようがないだろ
早がってんしたエスパースキルゼロのうっかりさんが
早漏の言い訳をぐだぐだぐだぐだぐだぐだぐだぐだぐだぐだ
くだらねー
0435名無しさん@お腹いっぱい。
2015/03/14(土) 05:44:10.73中卒もたいがいにしとけ
0436名無しさん@お腹いっぱい。
2015/03/14(土) 07:03:54.77countは動詞だけじゃなく名詞にもなるんだよ、知らなかった?
0437名無しさん@お腹いっぱい。
2015/03/14(土) 08:50:28.210438名無しさん@お腹いっぱい。
2015/03/14(土) 18:41:01.09名詞が連続してるが、それはどう言い訳するんだ?
0439名無しさん@お腹いっぱい。
2015/03/14(土) 21:16:03.47-c
--count
Suppress normal output; instead print a count of matching lines for each input file. With the -v (--invert-match) option, count non-matching lines. (-c is specified by POSIX.)
0440名無しさん@お腹いっぱい。
2015/03/15(日) 00:27:31.56bbbbaaa124iiiiiccccaaaa456lllllddddaaa789と書いてあった場合に、
特定の文字列の後に続いている数字を、スペース空けて抜き出す書き方はないでしょうか
うえの場合だとaaaの後にあるものを抜き出すように、124 456 789のような・・
素人質問ですいませんがよろしくお願いします
0441名無しさん@お腹いっぱい。
2015/03/15(日) 01:12:54.15$ echo "bbbbaaa124iiiiiccccaaaa456lllllddddaaa789" | grep -Po '(?!aaa)[[:digit:]]+' | tr '\n' ' '
0442名無しさん@お腹いっぱい。
2015/03/15(日) 02:09:05.45できました!
使わせていただきます。ご親切にありがとうございました。
0443名無しさん@お腹いっぱい。
2015/03/15(日) 03:20:18.84上の例でbbbbaaa124iiiiicccc222aaaa456lllllddddaaa789とあった場合に、
aaaの直後でない222は省いて124 456 789だけ方法はないでしょうか
何度もすいません
0444名無しさん@お腹いっぱい。
2015/03/15(日) 03:27:09.470445名無しさん@お腹いっぱい。
2015/03/15(日) 03:50:51.90完璧にできました!
この時間に回答いただけるとは思いませんでした。
大変助かりました。ありがとうございました。
0446名無しさん@お腹いっぱい。
2015/03/15(日) 13:29:40.91上の例で、bbbbaaa0.24iiiiicccc2.22aaaa456lllllddddaaa7.89 など
小数点も含む数字が混じっている場合に、同様の条件で0.24 456 7.9を抜き出す方法はないでしょうか
あまりにも聞きすぎなので最後にしようと思います。
0447名無しさん@お腹いっぱい。
2015/03/15(日) 14:11:57.45grep -Po '(?<=aaa)\d+(\.\d+)?
でもこれだと、".01" とかにはマッチしないけどね。
それと、"1.2.3" なんて文字列があると、"1.2" にマッチしちゃう。
0448名無しさん@お腹いっぱい。
2015/03/15(日) 14:12:54.78過去2回の答えがなぜそうなるのかを考えれば応用でいけるはずだ
0449名無しさん@お腹いっぱい。
2015/03/15(日) 14:15:07.460450名無しさん@お腹いっぱい。
2015/03/15(日) 14:16:19.36grep -o 'aaa[0-9\.][0-9\.]*' | sed 's/aaa//g' | tr '\n' ' '
0451名無しさん@お腹いっぱい。
2015/03/15(日) 14:37:30.13grep -Po '(?<=aaa)\d+(\.\d+)?(?=[^\d.]|$)'
0452名無しさん@お腹いっぱい。
2015/03/15(日) 14:52:31.67>>449
>>450
再度ありがとうございました。
私のファイルのケースですと450さんのやり方で完全にできました!
大変助かりましたし、勉強になりました。ありがとうございました。
>>448
本当そうしようと思います。
それ以前にgrepやsedは簡単な文字抜き出しぐらいにしか使ったことがなかったのですが、
こんなに便利だとは驚きました。学習して次は自分で解決できるようにしたいと思います
0453448
2015/03/15(日) 14:55:28.70grepの-PはPerlの正規表現として扱うためのオプションだ
Perlを知ってるなら問題ないが、知らないなら>>450のが多分勉強対象としては正しい
0454名無しさん@お腹いっぱい。
2015/03/15(日) 15:09:05.03投稿した後でレス確認しました。すいません。
こちらのやり方でもできました!ありがとうございました。
書き方の意味を勉強してみたいと思います。
>>453
ありがとうございます。perlも知らないので、
教えていただいたオプションの意味も含めて調べてみようと思います。
0455名無しさん@お腹いっぱい。
2015/03/25(水) 06:56:05.870456名無しさん@お腹いっぱい。
2015/03/25(水) 12:51:41.84専用コマンドってのは、gpg とか openssl みたいなのを指してるの?
python とか perl とかを使っていいのならライブラリ次第で何とでもなりそうだけど、
それも NG なのかな?
0457名無しさん@お腹いっぱい。
2015/03/25(水) 15:07:14.94tr A-Za-z N-ZA-Mn-za-m
0458名無しさん@お腹いっぱい。
2015/03/25(水) 18:11:12.120459名無しさん@お腹いっぱい。
2015/03/27(金) 22:26:36.44何かおすすめの本ないですか?
0460名無しさん@お腹いっぱい。
2015/03/28(土) 00:47:40.730461名無しさん@お腹いっぱい。
2015/03/28(土) 11:31:55.661234567890
なら
123456780
12345
なら
1235
になるような。
0462名無しさん@お腹いっぱい。
2015/03/28(土) 14:36:27.39後ろから2文字目なら
echo 12345 | sed -e 's/.\(.\{1\}\)$/\1/'
1235
0463名無しさん@お腹いっぱい。
2015/03/28(土) 15:15:24.11LL言語呼び出すにしても拡張ライブラリの専用コマンドに依存するのはNGじゃない?
nkfでrot13読むのは専用コマンドとは言えない気がするけど>>458だよなあ。
バイナリ法辺りを実装すればとりあえずなんとかなるんだろうか?
0464名無しさん@お腹いっぱい。
2015/03/28(土) 15:18:54.26rev, cut -c, head -c, tail -c などでいけるのでは?
$ echo 12345 | rev | cut -c1,3- | rev
1235
$ echo 1234567890 | rev | cut -c1,3- | rev
123456780
0465名無しさん@お腹いっぱい。
2015/03/29(日) 05:16:26.01>後ろからn文字目のみを削除する方法ってある?
a=1234567890; echo "${a%??}${a#?????????}"
0466名無しさん@お腹いっぱい。
2015/03/29(日) 08:10:35.43それ、n文字目と言うのが $n 変数に入ってる場合のこと聞いてるんでは? 固定数値ならいろいろ方法あるよ。
0467名無しさん@お腹いっぱい。
2015/03/29(日) 13:30:23.41可変でも同じことはできるけど。
a=1234567890; n=4; f(){ r=$1; while [ ${#r} != $2 ]; do eval r=\${r$3?}; done; echo $r; }; echo $(f $a $((${#a} - $n)) %)$(f $a $(($n - 1)) \#);
0468名無しさん@お腹いっぱい。
2015/03/29(日) 13:51:13.010469名無しさん@お腹いっぱい。
2015/03/29(日) 14:10:10.110470名無しさん@お腹いっぱい。
2015/03/29(日) 14:39:04.14範囲チェックはしていない
ncut () {
declare str="$1"
declare -i idx="$2"
declare -i len=$(expr length "$str")
echo $str | cut --complement -b$((len - idx + 1))
}
$ ncut 1234567890 2
123456780
$ ncut 12345 2
ncut 12345 2
0471名無しさん@お腹いっぱい。
2015/03/29(日) 14:40:32.78おっと、s/delcare/local/ でお願い
0472名無しさん@お腹いっぱい。
2015/04/06(月) 20:37:17.610473名無しさん@お腹いっぱい。
2015/04/06(月) 23:05:32.98xyzかきくけこabc
というファイルがあったときに
あいうえお
かきくけこ
と抜き出す方法にはどうすればよいでしょうか
grepなどを使うとおもったのですがうまくいきません。
よろしければご教示おねがいします
0474名無しさん@お腹いっぱい。
2015/04/07(火) 01:08:35.80lsのオプション弄ってパイプでsedに繋げばいい
変更ならrename使おう
0475名無しさん@お腹いっぱい。
2015/04/07(火) 01:19:37.060476名無しさん@お腹いっぱい。
2015/04/07(火) 23:44:39.59親ディレクトリ
/小ディレクトリA/photo/
/小ディレクトリB/photo/
/小ディレクトリC/photo/
みたいなディレクトリ構造があった時photo3つをpictureに
変更するにはどうすればよいのでしょうか
for文にmv入れ込めばできると思ったのですができませんでした
初歩的な質もう申し訳ありませんがよろしくお願いします。
0477名無しさん@お腹いっぱい。
2015/04/07(火) 23:56:55.050478名無しさん@お腹いっぱい。
2015/04/08(水) 00:23:18.58なんとか自己解決しましたそして>>477有難う
0479名無しさん@お腹いっぱい。
2015/04/08(水) 00:30:06.79for i in *; do cd $i; mv photo picture; cd ..;done
こうだ!!一つしか変わってなかったぜ
0480名無しさん@お腹いっぱい。
2015/04/08(水) 05:44:31.48for i in *; do mv "$i"/photo "$i"/picture; done
ディレクトリ名等にスペースが含まれていてもいいように $i は "$i" としておく。
0481名無しさん@お腹いっぱい。
2015/04/09(木) 06:55:16.580482名無しさん@お腹いっぱい。
2015/04/09(木) 08:37:12.980483名無しさん@お腹いっぱい。
2015/04/09(木) 19:49:27.510484名無しさん@お腹いっぱい。
2015/04/09(木) 22:21:14.400485名無しさん@お腹いっぱい。
2015/04/09(木) 23:52:38.50http://x68000.q-e-d.net/~68user/unix/pickup?rename
util-linuxのrenameコマンドの場合
rename -v photo picture */photo
Debian系だと正規表現指定、できるかは不明
https://wiki.ubuntulinux.jp/UbuntuTips/FileHandling/RenameCommand
FreeBSDだとsysutils/renameで正規表現指定、できるかは不明
http://www.freshports.org/sysutils/rename/
0486名無しさん@お腹いっぱい。
2015/04/15(水) 08:31:50.31$> printf ${TIME:5:11}
04/15
$> echo ${TIME:5:11}
04/15 08:25
$> printf "${TIME:5:11}"
04/15 08:25
罠だ、はまった。。。
0487名無しさん@お腹いっぱい。
2015/04/15(水) 08:45:36.46シェル変数の展開時には " " でかこんで "${HOGE...}" にするのが基本。
0488名無しさん@お腹いっぱい。
2015/04/15(水) 08:48:00.87date '+%m/%d %H:%M'
にした方がいいのでは?
0489名無しさん@お腹いっぱい。
2015/04/15(水) 08:48:10.66$ printf "${TIME:5:11}"
04/15 08:25
$ printf "%s %s\n" ${TIME:5:11}
04/15 08:25
0490名無しさん@お腹いっぱい。
2015/04/15(水) 09:14:12.79$ printf ${TIME:5:11}
04/15
$ /usr/bin/printf ${TIME:5:11}
04/15/usr/bin/printf: warning: ignoring excess arguments, starting with `08:25'
$ type printf
printf is a shell builtin
0491名無しさん@お腹いっぱい。
2015/04/15(水) 13:25:09.88$ printf ${TIME:5:11}
04/15
$ IFS="wanada"
$ printf ${TIME:5:11}
04/15 13:30
0492名無しさん@お腹いっぱい。
2015/04/15(水) 13:48:45.04$ TIME="2015/04/15 08:25:16"
$ printf ${TIME:5:11}
sh: Bad substitution
$ IFS='/ :'
$ set $TIME
$ echo $2/$3 $4:$5
04/15 08:25
0493名無しさん@お腹いっぱい。
2015/04/16(木) 23:26:24.70$ TIME="2015/04/15 08:25:16"
$ date '+%m/%d %H:%M' --date="${TIME}"
04/15 08:25
0494名無しさん@お腹いっぱい。
2015/04/30(木) 23:24:48.53■ このスレッドは過去ログ倉庫に格納されています