トップページunix
1001コメント297KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。2013/11/01(金) 07:58:50.52
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0876名無しさん@お腹いっぱい。2014/06/19(木) 15:38:27.70
C言語から学び始めた俺にとっては至極自然
とはいえサブシェルを{}で開くと違和感バリバリだが
0877名無しさん@お腹いっぱい。2014/06/19(木) 15:41:14.67
>>876
サブシェルは () だぞ。{ ;} は同じシェルの単なるグルーピング。

キモいと言ってるのはcase(switch)文をbreakする仕組み自体のことじゃなく、
そのbreakを ;; という記号で表すことについて言ってるんだけど。
0878名無しさん@お腹いっぱい。2014/06/19(木) 15:43:46.40
改行の代わりにコマンドを ; で区切る話じゃないのか?
08798762014/06/19(木) 15:50:23.77
すまん>>878のつもりでセミコロンの話解釈してたけどcaseの中身の話か
確かにありゃキモいな
そしてサブシェル勘違いorz
0880名無しさん@お腹いっぱい。2014/06/19(木) 16:26:09.26
findの-execのセミコロン「ゆ…許された」
0881名無しさん@お腹いっぱい。2014/06/19(木) 16:29:05.11
esacも;;も気にならんけど、(と対称にならないcaseのパターン指定はダメだ。
0882名無しさん@お腹いっぱい。2014/06/19(木) 16:37:30.82
bashだと、
case $var in (hoge) echo hoge;; esac
とか書けるんだ。
0883名無しさん@お腹いっぱい。2014/06/24(火) 02:53:56.45
なんか書き込みがずっとないからなんか書いてみよう
--
あるファイルに、
1
2
3..
という具合に、改行区切りで昇順に数字が書き込まれているとする
しかし、ファイル末尾の数値と行数が合わない為、どこかで数値が欠けている、もしくは重複していると予想される
ファイル内部は昇順ソート済みとして、重複・欠損している数値を洗い出す効率の良い仕組みを考える
shでもperlでもなんでもどうぞ
0884名無しさん@お腹いっぱい。2014/06/24(火) 06:25:38.91
awk 'NR!=$1{print NR}'
0885名無しさん@お腹いっぱい。2014/06/24(火) 06:58:51.21
i=1; while read line; do [ "$line" != $i ] && echo $i; i=`expr $i + 1`; done
0886名無しさん@お腹いっぱい。2014/06/24(火) 07:07:29.80
for((i=1; ;i++)){ read l||break;case $l in $i);;*)echo $i;;esac;}
0887名無しさん@お腹いっぱい。2014/06/24(火) 07:24:52.17
exec 3<&amp;0;yes ''|cat -n|while read f <&amp;3;do read i;[ "$f" != $i ]&amp;&amp;echo $i;done
0888名無しさん@お腹いっぱい。2014/06/24(火) 08:29:05.51
cat -n|while read a b; do case $b in $a);;*)echo $a;;esac;done
0889名無しさん@お腹いっぱい。2014/06/24(火) 09:28:26.18
遅レスだが、>>860については、俺はシェル変数使ってるな。
rcファイルでd=/path/nameとしておいて ls $d とか。
ホーム直下に一文字シンボリックリンク作るより文字数は少なくて済む。
0890名無しさん@お腹いっぱい。2014/06/24(火) 13:20:13.16
ファイル名をnumとして
diff -y --supress-common-lines <(seq 1 `tail -n1 num`) num
0891名無しさん@お腹いっぱい。2014/06/24(火) 13:39:07.32
他のがぱっと分からんけど、>>884って1回ズレたとこ見つけたらそれ以降全部吐かない?
えらい邪魔なような
0892名無しさん@お腹いっぱい。2014/06/24(火) 15:02:19.92
目的が差異の確認だしdiffが一番スマートな印象だなぁ…出力形式も変更が効くし
0893名無しさん@お腹いっぱい。2014/06/24(火) 15:04:16.55
>>890 だと標準入力から読めない。one passで実行できない。
0894名無しさん@お腹いっぱい。2014/06/24(火) 15:28:53.02
>>884がシンプルでいいと思う。
0895名無しさん@お腹いっぱい。2014/06/24(火) 15:41:08.12
one passが何かはよく知らないんだが、
・ファイルに書き込まれたものをチェックする前提がある=標準入力使う必要がない
・重複、又は欠損がある=複数、両方ある場合に全て検出するのが理想
というのを考えると、diffが一番いい答えを返してくれそうな気がする
>>884は確かにシンプルなんだが、ファイルの比較的先頭のほうが狂ってた場合、それ以降を全部出力しちゃうっていう点で微妙な気もする
0896名無しさん@お腹いっぱい。2014/06/24(火) 17:00:58.98
>>895
headすればいいじゃん。
そんなに頻繁に使うものとは思ってないので、書きやすい方がいいと思いました。
0897名無しさん@お腹いっぱい。2014/06/24(火) 17:31:03.08
>>890 だと、
もしファイルの最終行が間違っていて 最終行の内容が 1 とかだったら、
どの行が違っているのか全然チェックできない。
0898名無しさん@お腹いっぱい。2014/06/24(火) 17:46:42.34
シェルを書く際の注意事項があります。
コンピュータのCPUが何ビットであるか調ベておく事が大切です。

32ビットCPUを登載したコンピュータには、
32ビット用のシェルを書くこと。

64ビットCPUを登載したコンピュータには、
64ビット用のシェルを書くこと。

これを間違えればシェルが動きません
0899名無しさん@お腹いっぱい。2014/06/24(火) 18:07:22.22
自閉症あらわる
0900名無しさん@お腹いっぱい。2014/06/24(火) 18:10:05.25
シェルの意味が分かってないんじゃないの?
0901名無しさん@お腹いっぱい。2014/06/24(火) 18:16:36.30
いつもの改変コピペ君。
相手しちゃいかん。
0902名無しさん@お腹いっぱい。2014/06/24(火) 18:36:12.99
--suppress-common-lines のスペルが違ってたり、
プロセス置換使って互換性無いのに backquote 使ってるのも気になるが、
diff がいいんじゃないの。
重複、欠損が1つとは限らないし、ワンライナーでなくスクリプトの話でしょ?

あと、yes '' | cat -n とかおもしろい。
改行区切りで昇順なのに、 >>897 の "最終行の内容が 1" って突っ込んだら負けなのか?
0903名無しさん@お腹いっぱい。2014/06/24(火) 20:06:24.04
>>883

$ cat a.txt | tee >(uniq -d) >(uniq | awk 'NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}') &>/dev/null

moreutils の pee を使う場合

$ cat a.txt | pee "uniq -d" 'uniq | awk '\''NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}'\'''
0904名無しさん@お腹いっぱい。2014/06/24(火) 20:38:13.53
peeとかすごいネーミングw
0905名無しさん@お腹いっぱい。2014/06/24(火) 20:42:14.23
$ seq 1 `cat a.txt | wc -l` > tmp.txt; diff a.txt tmp.txt; rm tmp.txt
とかでよくね
0906名無しさん@お腹いっぱい。2014/06/24(火) 20:48:11.55
添付ファイルとか品質低下し杉
0907名無しさん@お腹いっぱい。2014/06/24(火) 23:31:47.05
しばらく書き込みないと思ってたのに反応すごいな

>>902の「互換性ないのに`使ってる」っていう点なんだが、
プロセス置換の記述の中で``って使えない環境もあるのか?
プロセス置換自体よくわかってないとこあるからちょっとあれだが

プロセス置換と``が同時に使えない場合でも>>905みたいなのはさすがにな……
0908名無しさん@お腹いっぱい。2014/06/24(火) 23:33:33.50
つか、--surpress-common-linesの綴り間違ってたんだな……
これmanページから引っ張ってきたんだけどマニュアルの誤植なのか……
http://linuxjm.sourceforge.jp/html/gnumaniak/man1/diff.1.html
0909名無しさん@お腹いっぱい。2014/06/25(水) 00:44:07.04
出遅れたが、またawkで
awk '{if($0-p!=1)print NR,p,$0;p=$0}'
0910名無しさん@お腹いっぱい。2014/06/25(水) 01:16:53.80
>>909
これいいな。>>884の欠点を補った感じで
ifの構文がちょっとよくわからんのだけど
0911名無しさん@お腹いっぱい。2014/06/25(水) 01:32:44.63
この手のお題は入出力例が欲しいなぁ
0912名無しさん@お腹いっぱい。2014/06/25(水) 01:47:50.54
>>911
次やる時にはそうする
0913名無しさん@お腹いっぱい。2014/06/25(水) 03:19:08.72
>>852
出遅れどころじゃないけど、NULつけてLFと交換するとか:
sed -n -e 's/^NAME:\(.*\)$/\x00\1:/p' -e 's/^STYLE:\(.*\)$/\1,/p' | tr '\000\n' '\n\000'
0914名無しさん@お腹いっぱい。2014/06/25(水) 03:31:58.38
ゆえとたまきんのおしっこ直飲みしたい
0915名無しさん@お腹いっぱい。2014/06/25(水) 08:35:03.52
>>904 >>914 看過出来ないネーミング。直訳ひどいw
http://sourceforge.jp/projects/freshmeat_moreutils/releases/
> 0.7
> 2006-03-20 07:39
> おしっこ(パイプティー)ユーティリティが追加されました。
0916名無しさん@お腹いっぱい。2014/06/25(水) 09:48:52.03
渋谷に集まったサポーターが痴漢してるわけじゃなくて、
人の多いところに痴漢常習者が集まっただけ。
ジャニのコンサート会場の最寄駅なんかも沢山いる。
0917名無しさん@お腹いっぱい。2014/06/25(水) 09:53:42.42
>>915
まぁ機械翻訳だからな。
0918名無しさん@お腹いっぱい。2014/06/25(水) 13:05:29.67
>>907 クドくなるので >>902 では文章を削るばかりだったが、
もっと言葉を選べば良かった。互換性でなく portability とかの方が適切だったかも。

 >>890 では、zsh bash ksh の機能であるプロセス置換を使っているので、
portability は既に失われている。
 この為、back quote はあえて使う必要が無い。
スペルミス同様大した事じゃあ無いが、何で back quote 使ってるの?と気になった。

以下、念の為の補足。
 参考他で議論されている通り、一般的に back quote は、
公式には非推奨ではないものの、使わない様にしたい古いやり方。

 `...` は、POSIX 非互換のとても古い Bourne shell でのみ必要なレガシーな構文。

 ただし、このスレは Bourne Shell(/bin/sh) がデフォルトで、heirloom sh がどうのと
>>1 に書いてあるので、portability を考え back quote を使うか、特記して
dollar parens を使用する事が望ましい。

 個人的には POSIX デフォにしたいですが。

参考
Have backticks (i.e. `cmd`) in *sh shells been deprecated?
http://unix.stackexchange.com/questions/126927/
0919名無しさん@お腹いっぱい。2014/06/25(水) 13:21:13.94
>>918
890のbacktickは必要じゃないの?
というかコマンドの出力を文字列で参照するとき、backtickで括るのは珍しくないでしょbashでも
0920名無しさん@お腹いっぱい。2014/06/25(水) 13:31:15.56
入れ子にするときどう書く?
0921名無しさん@お腹いっぱい。2014/06/25(水) 13:31:59.11
2行に分ける
0922名無しさん@お腹いっぱい。2014/06/25(水) 13:33:39.24
バッククォートの入れ子は基本だな。新入社員のテストで良く使う。
バッククォートの3重入れ子までできて一人前。$( )なんかに逃げるのは半人前。
0923名無しさん@お腹いっぱい。2014/06/25(水) 13:51:24.95
cshでは入れ子にできないことを知って捨てる決意をした25年前
0924名無しさん@お腹いっぱい。2014/06/25(水) 15:05:29.35
漏れutilsってところが、また、そそるよな
0925名無しさん@お腹いっぱい。2014/06/25(水) 16:48:43.67
>>918
なるほど、/bin/shじゃ動かないのになんで/bin/shで使うバッククォート使ってるんだって話だったのか
個人的に$( )が使い慣れなてないだけだったんだけどね
bashなら問題なく動くから普通に記述してしまった
0926名無しさん@お腹いっぱい。2014/06/25(水) 16:51:45.83
>>922
さすがにバッククォートの3重入れ子とかするぐらいなら$( )使えよって思う
一応出来たけど汚い
0927名無しさん@お腹いっぱい。2014/06/25(水) 17:08:35.73
参考の様な意見が一般的だと言うだけで、ポータビリティが関係ないスクリプトでも、
`cmd` で書きつづける人もいるでしょうね。
たとえ、Obsolete and deprecated syntax とか legacy とか言われても。

少なくとも、>>919 >>921 >>922 は back quote なわけでしょ?
無用な議論するつもりは無いけど、しかしながら、
back quote を肯定する理由が有るなら、参考までに聞いてみたい。
何故に back quote を使っていますか?
0928名無しさん@お腹いっぱい。2014/06/25(水) 17:38:16.92
>>924 ダメ押しわろた
しかし、peeってw 分かった上であえて、peeなんだろうな。き、汚過ぎるわ
slとかtacみたいな、ひねりの効いたネーミングにはならなかったのかな
0929名無しさん@お腹いっぱい。2014/06/25(水) 18:42:08.63
>>919 いや、bash で backtick は、初心者か、
最近まで商用 UNIX さわってて、そのままの人とかじゃないですか?
ある程度、O'Reilly とか本を読んだり、ネットで知識を漁ったりすれば、backtick は無いはず。

ちょっと、検索しておいたのを、挙げておきます。
1. Classic Shell Scripting: Hidden Commands that Unlock the Power of Unix
http://books.google.co.jp/books?id=J9WbAgAAQBAJ
p156 $(...) を指して、
This style is recommended for all new development,and it is what we use in many of the examples in this book.
0930名無しさん@お腹いっぱい。2014/06/25(水) 18:43:19.31
2. Learning the Korn Shell, 2nd Edition
http://oreilly.com/catalog/korn2/chapter/ch04.html
The syntax of command substitution is:
$(Unix command)
...
(For backwards compatibility, the Korn shell supports the original Bourne shell (and C shell)
command substituion notation using backquotes: `…`. However, it is considerably harder to
use than $(…), since quoting and nested command substitutions require careful escaping.
We don't use the backquotes in any of the programs in this book.)
0931名無しさん@お腹いっぱい。2014/06/25(水) 19:00:58.91
>>927
バッククオートならどのシェルでも使えるからだよ
bash専用だから$()使ってもいい、という考えは別に否定しない
0932名無しさん@お腹いっぱい。2014/06/25(水) 19:05:59.07
見栄え重視。
入れ子にするなら$( )のほうが綺麗になるが、単発ならバッククォートのほうが見やすく思える
0933名無しさん@お腹いっぱい。2014/06/25(水) 20:02:42.64
>>931 >>932 ありがとう。
議論はしたくないので、お礼だけ。
0934名無しさん@お腹いっぱい。2014/06/25(水) 21:09:05.97
昔からやってる人間なら 新しい記法は知ってるけど慣れで昔のままってだけだよね
議論したくないとか言って古い人間の習慣をただdisってるだけだな
0935名無しさん@お腹いっぱい。2014/06/25(水) 22:37:49.34
人様に見せるコードなら着飾るけど
ワンショットの使い捨てなんてのは
各々書きやすいように書けばいいと思う
0936名無しさん@お腹いっぱい。2014/06/25(水) 22:56:49.49
逃げられたな。
0937名無しさん@お腹いっぱい。2014/06/25(水) 23:07:46.42
>>934 ありがとう。古い人間の習慣か。
バッククォートは一般的に、使わない様にしたい古いやり方だとは思うけど、参考を紹介する位。
議論しても平行線だろうし、人それぞれだなあと思ったよ。
それに、このスレはバッククォートがデフォだし。

>>936 けんか腰だな。
0938名無しさん@お腹いっぱい。2014/06/25(水) 23:12:47.46
逃げられたな。(170cm 60kg) <- 言いそう
逃げられたな。(190cm 90kg) <- 言わなそう
0939名無しさん@お腹いっぱい。2014/06/25(水) 23:15:15.27
逃げられたな。(178-75-32)
0940名無しさん@お腹いっぱい。2014/06/25(水) 23:26:54.42
>>939
誰だよw

逃げられたな。(163*90*53)
09419092014/06/25(水) 23:32:22.49
>>910
{if($0-p!=1){print NR,p,$0}
p=$0}
なら分かりやすかった? >>909の;はif文そのものを終わらせている
上記()の後の{}は中身が単文なので必須ではない
もし続けるならawkスレで
0942名無しさん@お腹いっぱい。2014/06/25(水) 23:51:38.16
>>935 使い捨ての話してどうする
0943名無しさん@お腹いっぱい。2014/06/26(木) 00:07:16.26
>>941
おおわざわざ解説ありがとう
やっぱシンプルかつ欲しい情報が的確に手に入る感じで好きだなこれ
0944名無しさん@お腹いっぱい。2014/06/26(木) 00:12:19.21
>>942
その点が明示されてないから好きにやれよとね
0945名無しさん@お腹いっぱい。2014/06/26(木) 00:14:13.89
その点てのはなんちゃら性とかいういわば目的ね
0946名無しさん@お腹いっぱい。2014/06/26(木) 01:03:51.25
決定版は >>909 だけど、性懲りもなく moremore pee でやってみる
とは言え、頭に D(uplicate)、S(kip)を付けただけだけど

$ cat a.txt | pee \
"uniq -d | sed -r 's/.+/D &/'" \
'uniq | awk '\''NR!=$1{list="S";for(i=NR;i<$1;i++){list = list " " i};print list;NR=$1++}'\'''
0947名無しさん@お腹いっぱい。2014/06/26(木) 02:16:29.93
しかしawkが思った以上に優秀だな
>>854といい>>909といい、フィールド抽出だけにしか使ってなかったawkがこうまで活躍するとは思わなんだ
0948名無しさん@お腹いっぱい。2014/06/26(木) 02:25:28.73
せ、sedだってチューリング完全だし、数字の計算くらいかけるはずだよ……
0949名無しさん@お腹いっぱい。2014/06/26(木) 02:48:31.76
awkすごいな あこがれちゃうな
0950名無しさん@お腹いっぱい。2014/06/26(木) 20:57:17.17
それほどでもない
0951名無しさん@お腹いっぱい。2014/06/26(木) 22:40:09.50
お前などperlに変えてやる a2p
0952名無しさん@お腹いっぱい。2014/06/26(木) 22:42:34.98
整数型を持たず浮動小数点で数扱ってるせいで
大きな数はまともに足し算すらできないawkが何だって?
0953名無しさん@お腹いっぱい。2014/06/26(木) 22:43:26.49
お前よりは有能だよ
09549092014/06/26(木) 23:46:34.93
>>883のお題がたまたまawkにぴったりだったということで。
>>884>>909をa2pに掛けてみたけど、やっぱり読みにくい。
rubyやpythonだと見た目よくなるの?
0955名無しさん@お腹いっぱい。2014/06/26(木) 23:59:19.69
1,a,あああ,2,b,いいい,3,c,ううう
11,A,あ,12,B,い,13,C,う
↑みたいなCSV形式のテキストがあるのですが、これを
1,a,あああ
2,b,いいい
3,c,ううう
11,A,あ
12,B,い
13,C,う
と、カンマ区切りの3列毎に改行させたく思ってます

今はawkを使い$1〜$9として取り出して、printfで$1","$2","$3;みたいに処理させてるのですが
かなり冗長な感じで、個人的に気に入ってません

何かいい方法ありますでしょうか
0956名無しさん@お腹いっぱい。2014/06/27(金) 00:04:54.49
cvsならVBA
クォート処理から解放される
0957名無しさん@お腹いっぱい。2014/06/27(金) 00:42:46.87
そういやこのスレのやり方よく知らないんだけど、次スレはいつ立てるん?
じきに埋まりそうだが
0958名無しさん@お腹いっぱい。2014/06/27(金) 00:46:17.58
sed 's/,/\
/6; s/,/\
/3'
ちょっと手元に検証環境がないから間違ってたらだれか修正してくれ
0959名無しさん@お腹いっぱい。2014/06/27(金) 01:25:56.61
>>958
955です

期待通り動作しました!!
ありがとうございます

sedの仕様等しらべて、動作原理を把握しようと思います…
0960名無しさん@お腹いっぱい。2014/06/27(金) 01:33:49.62
s/,/\
/n  ←n番目の","を改行に置換する
まず6番目置換して、次に3番目を置換。
順番逆だとうまく動かないから気を付けてな
0961名無しさん@お腹いっぱい。2014/06/27(金) 03:24:34.12
cat filename | sed 's/,/\ /3' | sed 's/,/\ /3' これを繰り返すのはだめなのかな。3と6で数字を2つも使うのがなんとも言えなくて スクリプト詳しくないから、何か問題があったら教えて欲しいです
0962名無しさん@お腹いっぱい。2014/06/27(金) 08:13:10.13
これでどうかな。繰り返してくれるよ
sed -e 's/,/\n/3; P; D'
0963名無しさん@お腹いっぱい。2014/06/27(金) 08:32:22.50
sedって大容量ファイルに弱いイメージあるから、パイプでsedを何回もつなげるのって
動作遅くなる印象がある
検証してないから実は早いかもしれんけど、綺麗さ考えてもなるべくsedは1回で終わらせたいな
0964名無しさん@お腹いっぱい。2014/06/27(金) 08:34:49.66
>>948
sedでlispを実装した剛のものがいる。
https://github.com/shinh/sedlisp
0965名無しさん@お腹いっぱい。2014/06/27(金) 08:40:29.48
>>962
おお、こんなの知らなんだ。これはイディオムになってるのか?
0966名無しさん@お腹いっぱい。2014/06/27(金) 08:44:13.06
>>963
昔のCPUではsedを複数パイプでつなぐと遅かったが、
今のマルチコア(スレッド)のCPUだとsed複数をパイプでつないだ方が(それぞれ別CPUコアで実行されるので)速くなる。
わざわざsedひとつにまとめるとかえって遅くなるので注意。
0967名無しさん@お腹いっぱい。2014/06/27(金) 12:10:12.50
>>964 す、すごいな。全体で591行は、思いのほか短いな
頭おかしいとか褒められてるしw

で、書き上げた後の感想がw
> 正直疲れたんで s/// 以外の sed script 書くのやめようかと思いますね

やっぱり、goto 文相当しかないし、きついよね。
深入りしない方が吉って事かな?とかいいつつ、sedlisp.sed 保存


>>965 ちょw イディオムってw てれるなー。ただ考えながらコマンド並べただけ
たぶん引っかかるのは、d と D や s/.*\n// の違いとかでしょ?

>>957 いつもぎりぎり。ってか埋まってから次スレとかもある
0968名無しさん@お腹いっぱい。2014/06/27(金) 12:46:39.33
sedも使い慣れるとほんとなんでもできるよな
lispはさすがに変態だとは思うが

さっと検索したらsedスレもあるな
スレタイシンプルすぎて笑ったw
0969名無しさん@お腹いっぱい。2014/06/27(金) 12:55:52.08
967 です
info sed の Examples/uniq とかみたら
> As you can see, we mantain a 2-line window using `P' and `D'. This
> technique is often used in advanced `sed' scripts
とかあるから、イディオムかって言えば、そうかもね
0970名無しさん@お腹いっぱい。2014/06/27(金) 13:50:32.44
lispは神言語だから、様々な環境上で再現されている
ニコニコ動画の投稿者コメント(ニワン語)とか、
エロゲスクリプト環境のNScriptとかでlisp実装した変態もいる

lispを変な環境で実装する、というのはlisperにとってある種の習性なのかもしれない
0971名無しさん@お腹いっぱい。2014/06/27(金) 14:44:29.63
>>955
grep -o '[^,]\+,[^,]\+,[^,]\+'
0972名無しさん@お腹いっぱい。2014/06/28(土) 01:22:09.24
>>971
目から鱗だわ
grepやりおる
0973名無しさん@お腹いっぱい。2014/06/28(土) 08:31:21.71
それならGNU awkでも
awk '{print RT}' RS="([^,]+,){2}[^,]+"
と思ったが、ヌルのフィールドがあるとうまくいかん
0974名無しさん@お腹いっぱい。2014/06/28(土) 22:33:32.71
>>971
すげー
だけどなぜ3つずつで改行されるのかわかりません(><)
アホなおれに原理を教えて誰かエロイ人
0975名無しさん@お腹いっぱい。2014/06/28(土) 23:06:59.94
>>971
[^,] が ',' 以外の任意の文字一つ
その後に "\+" で1つ以上ありったけ
その右にある','が1つ目の','
以下同文

1,a,あああ,2,b,いいい,3,c,ううう
には、まず
1,a,あああ がマッチする
-o オプションの説明通りにそのマッチしたのを出力した後、次に
2,b,いいい がマッチする
以下同文
0976名無しさん@お腹いっぱい。2014/06/28(土) 23:49:55.98
grep の -o オプションは、マッチした行じゃなくマッチした箇所を全部表示する
123abc456
という行にgrep -o [0-9] とかやると、
1
2
3
4
5
6
とかなる
レス数が950を超えています。1000を超えると書き込みができなくなります。