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

シェルスクリプト総合 その24©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2014/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/
0289名無しさん@お腹いっぱい。2015/02/02(月) 10:43:19.51
変数は大文字か小文字か。
個人的には環境変数と区別するために小文字なんだけど、
社内の他の人が書いたのを見ると大文字ばっかりなんだよな。
0290名無しさん@お腹いっぱい。2015/02/02(月) 12:18:06.01
いつexportしても問題が出ないような命名規則なら問題無しw
0291名無しさん@お腹いっぱい。2015/02/02(月) 21:56:58.79
質問です。
linux mint 17.1 でコマンドの練習してるのですが、
% ls -l
だと色々ずらーっと出るんですけど、本に書いてあるとおり、
ソートコマンドを練習しようとして
% ls -l | sort +4
と打ち込んでファイルサイズで降順ソートしたかったのですが
sort: cannot read: +4: そのようなファイルやディレクトリはありません
と出てしまいます。
bashですが、シェルの種類によってはこのオプション使えないんでしょうか。
-r等は正常に動作します。
0292名無しさん@お腹いっぱい。2015/02/02(月) 22:04:13.81
sort -k4
sort -k4r
0293名無しさん@お腹いっぱい。2015/02/02(月) 22:34:00.27
で、できました!有り難うございます!
0294名無しさん@お腹いっぱい。2015/02/03(火) 03:09:11.93
>>291-293
sort +4と同じ指定はsort -k5
たぶんls -lでファイルの所有者が全て同じで、できたと勘違いしてる
--debugオプションをつけるとわかりやすい
https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
> On older systems, sort supports an obsolete origin-zero syntax ‘+pos1 [-pos2]’ for specifying sort keys.
> The obsolete sequence ‘sort +a.x -b.y’ is equivalent to ‘sort -k a+1.x+1,b’ if y is ‘0’ or absent,
> otherwise it is equivalent to ‘sort -k a+1.x+1,b+1.y’.

sort +4という古いオプションの扱いはPOSIXのバージョンによるってことかな
https://www.gnu.org/software/coreutils/manual/html_node/Standards-conformance.html#Standards-conformance
0295名無しさん@お腹いっぱい。2015/02/03(火) 06:48:02.67
Linux だったら ls コマンドは GNU coreutils の ls だろうから、

$ ls -l --sort=size
or
$ ls -lS

でええじゃまいか
0296名無しさん@お腹いっぱい。2015/02/03(火) 08:37:05.99
( 検索結果で上位に上がると期待して ) 日本語訳を貼り付けておきます

http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja.html
http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_15.html#Standards-conformance
0297確認不足だった orz2015/02/03(火) 08:40:20.78
訂正

( 検索結果で上位に上がると期待して ) 日本語訳を貼り付けておきます

http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_15.html#Standards-conformance
http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_43.html#sort-invocation
0298名無しさん@お腹いっぱい。2015/02/04(水) 22:55:20.92
>>297
おお、infoの日本語訳できたんだ
man on WWWのように検索できるとさらにいいね
0299名無しさん@お腹いっぱい。2015/02/08(日) 15:04:24.54
よく使うワンライナーなどはどうやって呼び出すものなんですか?
何か簡単に管理する方法がありませんかね?
0300名無しさん@お腹いっぱい。2015/02/08(日) 15:06:57.37
zshならzawから
vimのUnite historyの様なgrep効くから、それで呼ぶか
編集して完成させる
0301名無しさん@お腹いっぱい。2015/02/08(日) 16:40:17.45
>>300
anything.elみたいなヒストリーサーチみたいですね。
bashなのでどうしたものか。
0302名無しさん@お腹いっぱい。2015/02/09(月) 09:34:08.43
>>299
aliasじゃないの?
0303名無しさん@お腹いっぱい。2015/02/09(月) 10:04:38.99
自分で書いたスクリプトはいつでも、一見、間違いのないように見えるw
0304名無しさん@お腹いっぱい。2015/02/09(月) 18:00:27.27
まったくだ(´・ω・`)
ぼくの書いたスクリプトが動かないなんてけしからん(´・ω・`)
シェルの方を治したまえ
0305名無しさん@お腹いっぱい。2015/02/09(月) 18:21:02.80
cygwinからLinuxに移植したシェルスクリプトが,ping部分で成功しなかった


declare -A URL
URL=(
  ["Vim_part24"]="http://peace.2ch.net/test/read.cgi/unix/1413122189/";
  ["vim_part5"]="http://anago.2ch.net/test/read.cgi/software/1379912425/";
  )

# ping for download
ping_error=0
for i in ${!URL[@]}
do
  # ping ${URL[$i]} > /dev/null
  ping -n 1 `echo ${URL[$i]} | awk -F"/" '/http/{print $3}'` > /dev/null
  if [ "$?" -ne 0 ]; then
    echo "${i} : can not contact ${URL[$i]}"
    ping_error=1
  fi
done
0306名無しさん@お腹いっぱい。2015/02/09(月) 18:41:13.94
ping -c 1 ... にするべきじゃないの?

pingのコマンドオプションって統一されてないよなぁ
0307名無しさん@お腹いっぱい。2015/02/09(月) 19:27:08.45
配列を使うのはダサいと思うのです。

#!/bin/sh
url_list='
Vim_part24 http://peace.2ch.net/test/read.cgi/unix/1413122189/
vim_part5 http://anago.2ch.net/test/read.cgi/software/1379912425/
'
ping="ping -w 3 -c 1"
echo "$url_list" | while read thr url __; do
case "$url" in
https?://*)
host=`echo $url | cut -d/ -f3`
if ! $ping $host >/dev/null; then
echo "$thr: cannot contact $url"
err=1
fi
;;
esac
done
exit $err
0308名無しさん@お腹いっぱい。2015/02/09(月) 19:28:49.19
ああ、case の条件部分がおかしい。
http://*|https://*|ftp://*)
だな。
0309名無しさん@お腹いっぱい。2015/02/09(月) 19:33:01.27
わざわざpingするのがわからん
0310名無しさん@お腹いっぱい。2015/02/09(月) 19:34:49.22
pingしなくても wget -T でタイムアウトできるしな
0311名無しさん@お腹いっぱい。2015/02/09(月) 19:39:42.45
俺んところの現場でも、ssh する前に ping するスクリプトを書いてる人がいたな。
これって、どこかに由来する文化なのかな?
(cronを「くーろん」と呼ぶみたいな?いや、これは違うかな……)
0312名無しさん@お腹いっぱい。2015/02/09(月) 19:43:34.71
>>306
サンキュー
windowsのsystem32/ping.exeが呼ばれてた
そりゃ移植性がないわけだ

>>307-308
コードありがとう

>>310
-Tオプションなんてあったのか

>>309
pingで鯖落ちてないか検査した後w3mで複数のURLから取ってきて
スレの上下の不要な広告など取り除いてから git commit して
その差分見るから

全部安全に通信できるか見てからやらないと、差分の時にちょっと問題になる
通信できなかったスレがマイナス差分で大量表示されたり、
次回は大量追加されたり

git reset hard HEAD~ するぐらいならあらかじめ通信検査してからやろうと思った
0313名無しさん@お腹いっぱい。2015/02/09(月) 19:45:19.02
>>310
それもあるし、どれかひとつでもエラーでping_error=1だからサーバの状態を確認してる感じがしない
0314名無しさん@お腹いっぱい。2015/02/09(月) 19:47:43.57
もうひとつバグってた。こうしないと常に0で終了しちゃう。
echo ... | {
while read ... do
...
done
exit $err
}
0315名無しさん@お腹いっぱい。2015/02/09(月) 20:32:51.35
>>312
> -Tオプションなんてあったのか

通信系のコマンドで、タイムアウトが指定できないものはスクリプトからは利用しないとか、
そういうことは考えないで作っちゃうタイプの方ですか?

ちなみに、大抵の通信系コマンドはタイムアウトが指定できるような気がする。
0316名無しさん@お腹いっぱい。2015/02/09(月) 20:46:31.70
Windows 7 からだっけか? デフォルト設定では ICMP echo をフィルタリングしてるのって
0317名無しさん@お腹いっぱい。2015/02/09(月) 21:22:03.82
>>302
> >>299
> aliasじゃないの?
長いワンライナーは場面ごとに手直しする必要のあることが多いから、
それだと融通がきかないことがありませんか?
0318名無しさん@お腹いっぱい。2015/02/09(月) 22:07:20.56
2chのスレが更新されてるかどうか(新しいレスがあるかどうか)チェックするのは自分もやってる
いろいろやり方はあるだろうけど、自分の場合は
libwww-perl(debian系)に入ってるHEADコマンドで.datファイルのLast-Modifiedフィールドみたいなのを見てる
0319名無しさん@お腹いっぱい。2015/02/10(火) 06:45:24.43
>>311
ここに書いてる奴本人じゃね?w
0320名無しさん@お腹いっぱい。2015/02/10(火) 06:59:04.70
>>316
XP じゃね?
毎回設定してたような気がする
2K は忘れた
0321名無しさん@お腹いっぱい。2015/02/10(火) 07:03:40.32
>>311
ダイヤルアップとかで最初の接続に時間がかかるから ping でネットワーク接続してから、おもむろに目的のアプリケーションで接続するって言うのがあったような気がする
0322名無しさん@お腹いっぱい。2015/02/10(火) 10:03:19.02
スクリプト化してると問題があったとききりわけが必要だから
ping打っているかどうか確認してるんじゃ?

>>321
ちょっと違うけど自動切断有効にしてて切れてほしくないときに
ping打ちっぱなしにしてたな
0323名無しさん@お腹いっぱい。2015/02/10(火) 10:06:07.01
>>318

差分は取得しないのか
0324名無しさん@お腹いっぱい。2015/02/10(火) 10:12:53.45
皆、同じようなことやってるんだなw
0325名無しさん@お腹いっぱい。2015/02/10(火) 10:32:51.28
>>322
切り分けといっても、pingが成功したらネットワーク的に問題ないとは言えないわけで……
対話環境で作業している時だったら、お手軽だから「まずping打ってみるか」というのは
分かる気がするけど、スクリプトの場合では中途半端なように思えます。

「ICMPは通るね」というのをスクリプト中から確認できても、それほど嬉しくはないよね?
0326名無しさん@お腹いっぱい。2015/02/10(火) 10:41:38.26
そういえばhttps対応とかが面倒で結局wget丸投げ取り込みとかに逃げてたりするけど
正しい汚染チェックってどうするべきなんだろう?
0327名無しさん@お腹いっぱい。2015/02/10(火) 11:00:13.65
>>325
ネットワークよりむしろ、ローカル的な問題がない事が確認できるんじゃないかな?
0328名無しさん@お腹いっぱい。2015/02/10(火) 11:05:04.42
>>327
どういうこと?
0329名無しさん@お腹いっぱい。2015/02/10(火) 11:07:57.10
>>321
なるほど。
自分ではそういう環境でスクリプトを走らせたこと無いけど、必要性は理解できる気がする。
0330名無しさん@お腹いっぱい。2015/02/10(火) 11:11:26.56
でも今どきそんな環境あんまりないよなぁ
0331名無しさん@お腹いっぱい。2015/02/10(火) 11:11:41.05
>>328
ネットワークの問題:待つ
ローカルの問題:別の方法を試す
0332名無しさん@お腹いっぱい。2015/02/10(火) 11:21:02.15
>>331
すみません、日本語でお願いします
0333名無しさん@お腹いっぱい。2015/02/10(火) 11:23:49.29
自力で何とかなる問題とならない問題を切り分ける。
0334名無しさん@お腹いっぱい。2015/02/10(火) 11:41:25.85
pingで切り分けになるか?
0335名無しさん@お腹いっぱい。2015/02/10(火) 11:43:10.44
F5アタック状態でいいならどうでもいいかもしれないな。
0336名無しさん@お腹いっぱい。2015/02/10(火) 12:28:31.34
pingはじくところもあるから
URL次第
0337名無しさん@お腹いっぱい。2015/02/10(火) 12:55:57.86
>>311
ベテランなら、サーバ自体死んでるか、sshdが動いてない(かfirewall等)
の切り分けを考慮してるんだろう。実際に使うスクリプトとしては正しい
0338名無しさん@お腹いっぱい。2015/02/10(火) 13:20:41.45
>>323
差分は専ブラで取得です^^;
0339名無しさん@お腹いっぱい。2015/02/10(火) 13:36:06.53
>>338
差分なんて git 以外にも diff や vimdiff 等あるからやってみたら?
0340名無しさん@お腹いっぱい。2015/02/10(火) 14:15:44.40
いやレンジ指定じゃないかと?
0341名無しさん@お腹いっぱい。2015/02/10(火) 19:43:43.25
>>299
alias も出たから、ついでに...

自分は ${HOME}/bin に、スクリプトとして書いているが、場所はどこでもいいから
どこかにまとめて保存しておけばいいのでは?例えば、~/bin/oneliner/ 等

それらのファイルは、grep で検索も出来るし、それで見つかった script を編集するなら
history -r script で履歴に読み込んで、コマンドライン上で編集が出来る

(あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
読み込んで実行とか
0342名無しさん@お腹いっぱい。2015/02/10(火) 22:45:11.06
>>341
> (あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
> 読み込んで実行とか
Ctrl+rでヒストリ検索でいいんじゃない?
0343名無しさん@お腹いっぱい。2015/02/10(火) 23:29:41.64
history -r script を bash の話と断って無かった。失礼しました

>>342
スクリプトファイルから履歴に読み込むと、行毎に履歴の最後に追加されるから
previous-history Ctrl-p (もしくは↑)で十分だけどね
0344名無しさん@お腹いっぱい。2015/02/14(土) 04:53:42.98
^string1^string2^
!n:gs/string1/string2/
!-n

等 bash で履歴を利用するものは shopt -s histverify すれば確認・編集が出来て便利だよね
0345名無しさん@お腹いっぱい。2015/02/16(月) 18:20:07.18
スレ違いスマソ

どうなっちゃうの、2ちゃん?
なんか、ツイッターとかFBみたくなるのか?
極端に利用者減ると思うけどな。

1 :ニライカナイφ ★ 転載ダメ©2ch.net:2015/02/16(月) 16:24:24.83 ID:???*
◆2ちゃんねるがdatを近日廃止、さらにウェブスクレイピングを用いた専用ブラウザ開発・
  公開は禁止して2015年3月3日以降はAPI経由の許諾制に

「2015/3/3以降、2ch.net専用ブラウザ(以下「専用ブラウザ」)を開発、
公開するには、2ch.netの所有者であるRaceQueen社の許諾を得て、
2ch.netが提供するAPI(以下「API」)を用いて開発する必要があります」

http://daily.2ch.net/test/read.cgi/newsplus/1424071464/
0346名無しさん@お腹いっぱい。2015/02/16(月) 18:27:38.42
いざとなったらこれだな
テキスト広告除去
w3m some_2ch_URL |sed '1,/^$/d'|sed -e '/^━━━*$/,$d'|sed '$d'

例えば

w3m http://peace.2ch.net/test/read.cgi/unix/1415634843/ |sed '1,/^$/d'|sed -e '/^━━━*$/,$d'|sed '$d'
0347名無しさん@お腹いっぱい。2015/02/16(月) 18:50:00.38
スレ違いだとわかってるならよそでやれ
0348名無しさん@お腹いっぱい。2015/02/16(月) 19:15:37.65
スレ的にはxdotoolとかでブラウザ操作すれば問題ないのではないだろうか?
0349名無しさん@お腹いっぱい。2015/02/21(土) 14:32:41.68
【実況】向かいの部屋に住んでいる女子高生が窓を開けたままオナニーしているんだが
http://hayabusa6.2ch.net/test/read.cgi/network/1387872458/
0350名無しさん@お腹いっぱい。2015/02/24(火) 13:40:24.51
質問です。
あるテキストの中に含まれる、特定のキャラクタの数を数え
たいのですが、すごく簡単にできそうで、わからなくて
悩んでおります。grepでもwcでもできそうで、できません。
ご教授お願いします。
0351名無しさん@お腹いっぱい。2015/02/24(火) 14:17:32.87
>>350
全キャラクタの後ろに改行を入れて、grep 'キャラクタ' | wc -lで数えられる
改行を入れるのはOSによって面倒だったりするが。。。
0352名無しさん@お腹いっぱい。2015/02/24(火) 14:32:17.30
>>350
キャラクタ A を数える場合、

tr -dc A | wc -c

>>351
すみませんが詳しい方のみ回答をお願いします
0353名無しさん@お腹いっぱい。2015/02/24(火) 14:40:49.91
wwwww


全キャラの後ろ(要するに1文字ごと)に改行は必要なくて
数えたいワード単位に改行入れて(sed)、grep、wcだね

sedあまり好きじゃないからperlならこう

perl -pe ’s/foo/foo¥n/g’ file | grep foo | wc -l

スクリプトにしてfooを引数にすりゃ汎用的に使える
0354名無しさん@お腹いっぱい。2015/02/24(火) 17:15:08.03
堂々とbashを使うお(´・ω・`)
0355名無しさん@お腹いっぱい。2015/02/24(火) 17:53:14.61
>>352で答は出てるけど、どーしても grep を使いたいなら
grep -o foo | wc -l

351とか353とか無駄すぎ。
353は1行に1回しかマッチしないことが保証できるので grep | wc ではなく、grep -c でよい。
0356名無しさん@お腹いっぱい。2015/02/24(火) 19:23:17.83
2chMateで質問を見て、これはこのスレで学んだgrep -oを披露するしかないと
意気込んで帰宅してスレ開いたら>>355に書かれていたでござる
0357名無しさん@お腹いっぱい。2015/02/24(火) 19:55:49.20
>>355
"A" が抜けてるんじゃ?

$ grep -o A foo | wc -l
0358名無しさん@お腹いっぱい。2015/02/24(火) 20:01:41.72
せやな
0359名無しさん@お腹いっぱい。2015/02/24(火) 20:07:04.10
せやろか
0360名無しさん@お腹いっぱい。2015/02/24(火) 21:34:48.78
>>350
ネタ的な解答です

echo $(( $( sed -e 's/[^で]//g; s/で/ + 1/g' data ) ))
0361名無しさん@お腹いっぱい。2015/02/24(火) 22:11:45.11
>>357
>>353ではfooが検索キーワードになっていることを受けてなんじゃね
ファイル名なりパイプ入力は実際に実行するには必要だが
言いたいことに焦点を当てるためと解釈すればおk
0362名無しさん@お腹いっぱい。2015/02/24(火) 22:42:20.20
昔はWindowsが好きでUnixは嫌いだったが、最近、シェルプログラミングの真髄、Unixの真髄が
身に染みてきた。VBSを仕事でやってるが、何せ長い。シェルスクリプトだと数十行で済むようなことが
何千行とかになってしまう。

Unixのコマンド自体がワンライナーで済んでしまうことも多いが、
シェルスクリプトや正規表現、Unixのアプリを組み合わせて20行、30行もかけば
かなりの処理ができるな。

ただし、VBSのすごいところは、GUIまでわりと自由に操作できることだな。

UnixもWindowsもそれなりに何かすばらしさを感じる。
0363名無しさん@お腹いっぱい。2015/02/24(火) 22:43:45.95
文字ではなく単語単位だと
マッチ部分が重複するケースもあると思うけど
そういう時はどう書けばいいんだろ

$ echo ABC | grep -Po '..'
AB
$ echo ABC | grep -Po '.(?=.)'
A
B

$ echo ABC | ?
AB
BC
が欲しい
0364名無しさん@お腹いっぱい。2015/02/24(火) 22:45:35.14
真髄ねー
0365名無しさん@お腹いっぱい。2015/02/24(火) 23:11:13.94
>>362
>>348とかどうよ?
0366名無しさん@お腹いっぱい。2015/02/25(水) 10:15:56.15
>>355
お前は4時間以上かけてそんな回答しかできないのか
0367名無しさん@お腹いっぱい。2015/02/25(水) 10:36:23.41
20時間以上かけた回答に期待
0368名無しさん@お腹いっぱい。2015/02/25(水) 21:30:04.01
str='>>350 ネタ2です。
ところで、あるテキストや特定のキャラクタは utf-8 であると考える必要性は有りや無しや。
神に問う。信頼は罪なりや。 果たして、無垢の信頼心は、罪の源泉なりや。'

echo "$str" | grep -o . | LC_COLLATE=C sort | uniq -c
echo "$str" | perl -0777 -ne 'print s/。//g,"\n"'
0369名無しさん@お腹いっぱい。2015/02/25(水) 22:36:30.27
>>365
楽しそうだね。でも、GUIの操作をすべてコマンドからやりたいよ。
オブジェクトでも作る?
0370名無しさん@お腹いっぱい。2015/02/25(水) 22:47:56.06
xteじゃダメ? ドラッグの仕方はよくわからんが。
0371名無しさん@お腹いっぱい。2015/03/02(月) 23:05:19.70
明日以降は、ここを見る回数も減るかもしれない。みなさん一応さようなら
ネタは不評だったけど、最後かもしれないし >>363 にも答えておこう。
perl と ruby で

#!/bin/sh
echo '商工会議所長' |
 perl -ne 'while( /(?=(会議所|所長))/g ){ print $1, "\n"; }'

echo '商工会議所長' |
 ruby -Ku -ne 'puts $_.scan( /(?=(会議所|所長))/ ).join( "\n" )'
0372名無しさん@お腹いっぱい。2015/03/02(月) 23:11:47.85
>>348で落としてdat変換位、スクリプトで出来ないかな?
0373名無しさん@お腹いっぱい。2015/03/03(火) 03:08:17.32
>>371
何がなんだか…w
0374名無しさん@お腹いっぱい。2015/03/03(火) 08:07:50.39
>>371って問題がわかってないよな
「aaaaaaaaaa」に対して「aa」が
どうマッチするかってことなんだけど
なんで会議所と所長になっちゃうんだろうかw
脳味噌足りてなさそう
0375名無しさん@お腹いっぱい。2015/03/03(火) 17:30:06.70
$ echo 'ABC' | perl -ne 'while( /(?=(AB|BC))/g ){ print $1, "\n"; }'
AB
BC

じゃまずいのかな。
03763712015/03/04(水) 06:55:50.72
>>375
>>374 に対しての発言の様にも取れるけど、>>371 に対しての発言ならば...
それも試した上で、書いてる

無反応だったけど >>368 で utf-8 である事を考えていないものが有る事を指摘したので
引き続き、>>363 のお題
> 単語単位だとマッチ部分が重複するケース
に沿って、日本語に入れ替えただけ
0377名無しさん@お腹いっぱい。2015/03/04(水) 13:23:38.19
>>363は任意のテキストに使える記述を期待してるんじゃないだろうか
所長と会議所限定じゃなく
03783632015/03/04(水) 22:12:28.21
>>377
いや…
スレタイ的にLL言語に頼らないやり方を期待してた
0379名無しさん@お腹いっぱい。2015/03/04(水) 22:57:35.29
スレとあんま関係ないんだけど、
みんなどんな時も/bin/sh縛りなの(´・ω・`)?

それとも割と躊躇なく、bashとかzsh使うの(´・ω・`)?

使う人はどういう線引きで/bin/shと高機能シェルを使い分けてるの(´・ω・`)?
0380名無しさん@お腹いっぱい。2015/03/04(水) 23:04:13.67
スレと関係ないからよそでやってくれる?
03813712015/03/06(金) 06:31:41.84
>>353 でも perl は使われているのだが、ワンライナーも許されませんか

wikipedia で LL言語を見ると、awk も AUTO だけど、sed は入っていなかったので
sed を使って無理やり書いてみよう
.*? が使えないので .. みたいな正規表現への対応は思いつけなかったけど、単語を抜き出すだけならこれで

#!/bin/sh
re1=${1:-会議所\|所長}
str=$re1
while
 re2=$re2$( echo "$str" | sed -e 's/^\(.\).*/\1/' )
 length=${#str}
 str=${str#*|}
 [ "${#str}" -ne "$length" ]
do
 :
done

# ここから
sed -ne '
 : loop
 /'"$re1"'/ {
  s/^[^'"$re2"']*\('"$re1"'\)/\1\n/
  P
  s/^.\(.*\)\n/\1/
  b loop
 }
'
0382名無しさん@お腹いっぱい。2015/03/06(金) 06:33:59.92
bash でも

#!/bin/bash
re1=${1:-会議所\|所長}
str=$re1
while
 re2=$re2${str:0:1}
 length=${#str}
 str=${str#*|}
 [ "${#str}" -ne "$length" ]
do
 :
done

while
 IFS= read -r line
do
 while
  [[ "$line" =~ ^[^${re2}]*((${re1}).*) ]]
 do
  echo "${BASH_REMATCH[2]}"
  line=${BASH_REMATCH[1]}
  line=${line#?}
 done
done
0383名無しさん@お腹いっぱい。2015/03/06(金) 06:36:18.16
使用例

$ echo 'abc' | ./testsed 'ab\|bc'
ab
bc

$ echo 'abc' | ./testbash 'a.|b.'
ab
bc
03843712015/03/06(金) 07:34:31.86
訂正
全般的に変数代入の箇所のクォート
var="var"


#!/bin/bash
re1="${1:-会議所|所長} "
0385名無しさん@お腹いっぱい。2015/03/06(金) 08:05:27.13
読む気もおきないです本当にありがとうございました
0386名無しさん@お腹いっぱい。2015/03/06(金) 09:15:28.00
371って問題が理解できてない残念な子だな
0387名無しさん@お腹いっぱい。2015/03/08(日) 00:18:10.47
>>379
個人用とか、そのマシンに特化したスクリプトならbashだろうがzshだろうが何でもアリだけど
普段から/bin/sh縛りにしておくと、違うマシンでもスクリプトが書けるようになるぞ
0388名無しさん@お腹いっぱい。2015/03/08(日) 03:45:15.37
と思うだろ。
でも実際は変な癖がそれぞれついてるんで、あまり役に立たない。
0389名無しさん@お腹いっぱい。2015/03/08(日) 05:35:53.00
bash拡張を使うなら#!/bin/bash
■ このスレッドは過去ログ倉庫に格納されています