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

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

■ このスレッドは過去ログ倉庫に格納されています
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/
0325名無しさん@お腹いっぱい。2014/02/22(土) 09:13:40.98
>>315
Solaris とかは /bin は /usr/bin へのシンボリックリンクだね。
0326名無しさん@お腹いっぱい。2014/02/22(土) 09:17:42.37
イマドキは /system/bin/sh だったり、、
0327名無しさん@お腹いっぱい。2014/02/22(土) 11:01:57.40
>>324
「Debian,Ubuntu,Gentoo,Archはない」って書いてあるのでは?
0328名無しさん@お腹いっぱい。2014/02/22(土) 12:06:00.19
>>325
>>326
個人的に、そういう構成、マジで誰得なんだ?って思う
0329名無しさん@お腹いっぱい。2014/02/22(土) 13:21:23.93
>>325
Archも/binと/sbinが/usr/binになってるな
0330名無しさん@お腹いっぱい。2014/02/22(土) 13:24:08.27
/binが/usr/binのシンボリックリンクになってるのは過去の互換性というか
#!/bin/bash って書いちゃってるスクリプトへの対処療法的な措置だろ
0331名無しさん@お腹いっぱい。2014/02/22(土) 15:09:58.51
>>330
そんなおまぬけの救済なんてしなくていいのに
0332名無しさん@お腹いっぱい。2014/02/22(土) 16:57:37.93
しかし
#! /usr/bin/env bash
だとPATHに自分でコンパイルしたbashとかあった時にそっちが実行されちゃう罠
0333名無しさん@お腹いっぱい。2014/02/22(土) 18:12:16.67
$ type env
env is /usr/local/bin/env
0334名無しさん@お腹いっぱい。2014/02/22(土) 19:08:02.27
bashも/usr/local/binへインストールされているのがおにあい。
0335名無しさん@お腹いっぱい。2014/02/22(土) 19:15:41.79
FreeBSDでは実際/usr/local/bin/bashに入るしね
0336名無しさん@お腹いっぱい。2014/02/22(土) 19:48:12.61
#! /usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin bash
0337名無しさん@お腹いっぱい。2014/02/22(土) 21:11:31.17
>>328
嫌なら rm /bin しとけばいいんじゃね。
0338名無しさん@お腹いっぱい。2014/02/22(土) 22:35:54.11
rmは怖いからunlink使うことにしてる
0339名無しさん@お腹いっぱい。2014/02/22(土) 23:22:31.91
ミッションクリティカルな分野とかスパコンとかでも、徐々にLinuxが浸透しつつあるし
商用Unixが駆逐される日も遠くないだろうな
そのときは晴れてシェルがbashとzshに統一されるわけだ
0340名無しさん@お腹いっぱい。2014/02/23(日) 01:06:17.56
>>314>>327
>>308はデフォルト環境じゃない状態でのサーバだから参考程度

>>324
>>301>>307はcshの話だけど>>299>>304-306>>312はzshの話
301の場合入ってなくても弾かれるだけだが、299,304-306の場合ログイン不能になるからまじでヤバイ
0341名無しさん@お腹いっぱい。2014/02/23(日) 22:40:39.22
bashはGPLだしそのあたりがまずいこともあるはず何だよな。
ところで、/usr/binって、/binへ移行していく風潮なかったけ?

その話を見たとき、数年後にはまた、パス関係ではまるのかーと少し意識した記憶がある。
0342名無しさん@お腹いっぱい。2014/02/23(日) 22:44:06.71
少なくともFedoraとArchは逆だな
最近/binがなくなって/usr/binになった
一応シンボリックリンクとして残っているけど
0343名無しさん@お腹いっぱい。2014/02/23(日) 23:06:55.05
>>341
基本は /usr/ 以下に移そう、ほんとに必要なのだけ / 直下に置こう、
っていう方向じゃないの。
0344名無しさん@お腹いっぱい。2014/02/24(月) 02:25:20.47
rootが何かしないと変更されないものはusrだっけ。usrをnfsでmountする時はどうするんだろ。
0345名無しさん@お腹いっぱい。2014/02/24(月) 08:35:23.83
その辺はFHSでも読んでくれ。
0346名無しさん@お腹いっぱい。2014/02/24(月) 08:39:49.50
FHSだとNFSまでの最低限は/binに入れるだったのでは。
0347名無しさん@お腹いっぱい。2014/02/24(月) 09:06:15.40
>>346
それは /sbin
0348名無しさん@お腹いっぱい。2014/02/24(月) 11:07:05.89
/sbin/sh がないので /sbin だけじゃ NFS マウントできないのでは?
solaris は /sbin/sh があるので可能だけど。
0349名無しさん@お腹いっぱい。2014/02/24(月) 11:10:08.04
>>348
> /sbin/sh がないので
それどのOSの話?
0350名無しさん@お腹いっぱい。2014/02/24(月) 11:20:46.09
>>349
たいていの OS。
起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
/bin は少なくともローカルになければならない。
solaris はそうなっていないので、/sbin だけローカルにあれば /bin も NFS に置ける。
というか、/bin -> /usr/bin の symlink だけど。
0351名無しさん@お腹いっぱい。2014/02/24(月) 11:25:45.58
>>350
> 起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
それ思い込みじゃね?
0352名無しさん@お腹いっぱい。2014/02/24(月) 11:41:04.26
手元のUbuntu見ると、確かに/sbin/shは無いな
何故無いんだろう。まずいことでもあるんかな
0353名無しさん@お腹いっぱい。2014/02/24(月) 17:17:57.92
/etc/fstabに書かれたNFSなどは初回は無視されて、それマウントするのがinit.dのnetfsとかのシェルスクリプトだっけか
確かUbuntuでnetfs自体行方不明だったから仕方なくrc.localだかにmount -aを書いた覚えがあるけど、
最近はその手の初期化周りを制御するinitdを置き換えるlaunchdとかも出てきてるし今はどうなってるんだろうな?
0354名無しさん@お腹いっぱい。2014/02/24(月) 17:22:15.07
もういいかげんスレ違いじゃね。
0355名無しさん@お腹いっぱい。2014/02/24(月) 22:05:45.65
/sbin/shは昔はもっと意味があったのだよ
今は/usr何かを別のファイルシステムでマウントするとかほとんどないからな、さして重要な意味がないのでlinux何かでは一緒くた。
solarisでも今は形骸化してる。
/binだけローカルにあったって、実行できないんだぜ?
0356名無しさん@お腹いっぱい。2014/02/25(火) 01:07:06.24
>>343
ありゃ、逆でしたか失礼。
シェルの先頭で変数に入れちゃうから、かわってもそこを変えるだけですむようにはなっているのですがね。
バージョン違いでパスがかわるとめんどうだなぁ。
0357名無しさん@お腹いっぱい。2014/02/25(火) 01:17:07.19
シェルで@はOKですが、AがNGです。 シェルの中でfindコマンドは*(アスタリ スク)は使用できないのでしょうか? echoで表示は出来ているのですが。。。

# @ これはOK
find /log/*/*/*.log -type f

# A これがNG
set target="/log/*/*/*.log"
echo ${target}
find "${target}" -type f
0358名無しさん@お腹いっぱい。2014/02/25(火) 01:23:50.19
引用符外してみたらどうでしょ
0359名無しさん@お腹いっぱい。2014/02/25(火) 01:30:20.87
target='./log/*/*/*.log'
echo "$target"
find ${target} -type f

setって何だよ
0360名無しさん@お腹いっぱい。2014/02/25(火) 01:42:43.84
cmd.exeっていうシェルの環境変数設定コマンド
0361名無しさん@お腹いっぱい。2014/02/25(火) 01:44:55.10
これが社史編纂室系か
0362名無しさん@お腹いっぱい。2014/02/25(火) 02:02:27.91
社史を編纂しながらシェルスクリプトを作っていく、か

どうすればそんなうらやましい立場になれるんだ
0363名無しさん@お腹いっぱい。2014/02/25(火) 02:03:13.53
>>355
うちのDebianの/binで調べたら、/usrにリンクしてるのは、ping6だけだった。普通、/libに入れるんじゃないか。
0364名無しさん@お腹いっぱい。2014/02/25(火) 06:49:13.36
オレあと3年で定年だから社史編纂室みたいなところで平穏無事に時間だけ早く3年経って欲しいわ
0365名無しさん@お腹いっぱい。2014/02/25(火) 08:03:02.89
>>364
老い先短いんだから平穏無事はともかく時間を急いては勿体無いですよ、先輩。
0366名無しさん@お腹いっぱい。2014/02/25(火) 17:27:12.85
bashで、メールが来た時 You have mailって出ますよね。
これを、特定の相手からのメールのみ表示するとか、相手によって表示メッセージ変えることとかできますか?
0367名無しさん@お腹いっぱい。2014/02/25(火) 17:33:51.26
できません。
0368名無しさん@お腹いっぱい。2014/02/25(火) 22:15:55.65
bashじゃなくてもいいんですが、メールが来た時 You have mailって出るのを、
ウェブメールにも対応させることってできますか?
0369名無しさん@お腹いっぱい。2014/02/25(火) 22:21:28.60
できません。
0370名無しさん@お腹いっぱい。2014/02/25(火) 22:49:28.41
bashかzshで、ウェブサイトにhttpsでアクセスして、
認証させて、ページ内容のHTMLを取得して、
解析したり加工したりして前回との差分を取る関数を作って、
その結果でプロンプトを変えることはできますか?
0371名無しさん@お腹いっぱい。2014/02/25(火) 22:55:36.70
できる
0372名無しさん@お腹いっぱい。2014/02/26(水) 08:11:52.00
優しいやつめ
0373名無しさん@お腹いっぱい。2014/02/26(水) 12:17:53.68
できるとは思うけど、ネットの都合によっては、
プロンプト出すたびに10秒とか1分とかかかりそう。
バックグラウンドで数分おきに監視して、
ファイルに蓄積していくとかすればいいのかな。
0374名無しさん@お腹いっぱい。2014/02/28(金) 11:38:51.59
bash で書いたスクリプトって、そのままでzshでも動きますか?
0375名無しさん@お腹いっぱい。2014/02/28(金) 11:55:22.31
とりあえずword splitでハマる
0376名無しさん@お腹いっぱい。2014/02/28(金) 12:09:17.24
posix準拠のみの機能しか使ってなければ大丈夫
0377名無しさん@お腹いっぱい。2014/02/28(金) 12:25:19.32
posix準拠のみの機能しか使ってなくてもword splitでハマる
0378名無しさん@お腹いっぱい。2014/02/28(金) 14:48:39.14
zshってcsh並に絶滅寸前だよね・・・
0379名無しさん@お腹いっぱい。2014/02/28(金) 14:49:38.13
いっしょにすんなw
0380名無しさん@お腹いっぱい。2014/02/28(金) 15:51:59.28
ビル・ジョイに失礼だ。
0381名無しさん@お腹いっぱい。2014/02/28(金) 18:30:50.64
すみませんでした
cshはまだまだ減益ですね
0382名無しさん@お腹いっぱい。2014/02/28(金) 18:36:01.06
いいえcshが原液だったことはありません
0383名無しさん@お腹いっぱい。2014/02/28(金) 19:54:21.74
1
ターミナルから青空文庫など文章サイトの特定のhtmlにアクセスして、タグを除いた文章のみを抽出し、それをテキストファイルにして保存。
(出来ればそれをTeX文書にして、事前に決めた設定でPDF出力)

2
ターミナルから音楽視聴サイトなどのhtmlにアクセスして視聴できる曲のタイトルを抽出したのちプロンプトに表示。
その後入力を促し、入力に応じてプレイヤーで特定の曲を聴く、もしくはなにもしない。
(そのサイトではタイトルからmp3のurlが推測可能で、タイトルさえ取れればいい)

ということをやるために勉強をしたいのですが、
こういうことをやる為にはシェルスクリプトを勉強すれば大丈夫ですか?
それともCとかPythonとかPerlとかを勉強した方がいいですか?
0384名無しさん@お腹いっぱい。2014/02/28(金) 19:58:10.34
ちょっと質問いいですか
if文でこんなふうに x とかの文字を挟むスクリプトをよく見かけるんですが
if [ "x$hoge" == "xYes" ]
なんでこうするんですかね?普通に
if [ "$hoge" == "Yes" ]
じゃまずい場合があるとか?
0385名無しさん@お腹いっぱい。2014/02/28(金) 20:05:26.65
>>383
htmlのパーサはbashじゃちと辛いからPerlとかPythonとかが一番向いてると思う
その用途ならCは要らんな
0386名無しさん@お腹いっぱい。2014/02/28(金) 20:45:34.67
>>385
ありがとうございます。
いずれにしろ使える知識なので少しは勉強するつもりですが
上の目的の為にはPerlかPythonを使います。
0387名無しさん@お腹いっぱい。2014/02/28(金) 21:01:20.16
>>384
$hoge に空白が入ってきた場合や何も入っていない場合に

if [ "$hoge" == "Yes" ]
だと
if [ == Yes ]
こうなり、

if [ "x$hoge" == "xYes" ]
だと
if [ x == xYes ]
こうなる。

なので、
0388名無しさん@お腹いっぱい。2014/02/28(金) 21:13:35.45
ワロタw
0389名無しさん@お腹いっぱい。2014/02/28(金) 21:34:57.30
>>387
変数をダブルクォートで囲ってあれば、xとか前につけなくても平気じゃないの?
昔、つけないとヤバイ場合があった記憶があるんだけど思い出せない
0390名無しさん@お腹いっぱい。2014/02/28(金) 22:03:37.81
俺は "-x" のようにハイフンで始まるとオプションとして扱われるからだったような気がするけど
手元で試したら普通にハイフンで始まっても大丈夫だったな
0391名無しさん@お腹いっぱい。2014/02/28(金) 22:23:09.55
あと [ ] 内って == 使えたっけ?
0392名無しさん@お腹いっぱい。2014/02/28(金) 22:26:08.16
うちの環境だと
/usr/bin/[ は == がOK
bashの組み込みの[も == がOK
sh(dashだった)の組み込みの[は == がNG
03933842014/02/28(金) 23:21:24.48
>>387
いや、>>389の言う通り、普通は未定義変数でもダブルクォートしてれば空文字扱いになるよね?
おそらくそうはならない環境のための配慮かと思ったんだけど・・・
誰かこの辺詳しい人いません?
0394名無しさん@お腹いっぱい。2014/02/28(金) 23:45:51.04
>>393
http://stackoverflow.com/questions/6852612/bash-test-for-empty-string-with-x
0395名無しさん@お腹いっぱい。2014/03/01(土) 00:00:04.36
>>394
おードンピシャなページですわthx
なるほど、[ がビルトインじゃない時代の互換性のためだったのね
じゃあ今の時代では必要なシーンなんてほぼ皆無だろうね
0396名無しさん@お腹いっぱい。2014/03/01(土) 08:47:18.39
未だに if [ "x$hoge" = "xYes" ] とか書いてるプログラマーorシス管見つけたら
社史編纂室に異動させるわ
0397名無しさん@お腹いっぱい。2014/03/01(土) 14:12:39.58
>>383
連番のH画像/動画を一気にダウンロードする6
http://toro.2ch.net/test/read.cgi/unix/1349257148/

スレ2個目ぐらいまでが参考になる。
0398名無しさん@お腹いっぱい。2014/03/01(土) 15:45:04.91
既存ファイルの特定文字列にマッチした行の下に、任意の文字列を挿入する一般的な方法ってないですか?
ここで言う任意の文字列というのは、$'"/などの記号文字や改行も含む複数行から成る文字列です。
できれば

str="
文字列1
文字列2
・・・
文字列n
"

というstrを作った上、sedなどで一発でできればいいのですが。
0399名無しさん@お腹いっぱい。2014/03/01(土) 16:38:27.39
>>395
ビルトインでない [ はビルトインの [ を持っていないシェルのために存在するものちゃうの?
将来的には消してビルトインの方に統一するんちゃうの?

やったら逆やと思うんやけど。
0400名無しさん@お腹いっぱい。2014/03/01(土) 16:45:16.38
>>398
sed '/hoge/a --foo--\n--bar--' -i file
0401名無しさん@お腹いっぱい。2014/03/01(土) 17:00:58.86
ここのスレレベル低いから質問しても知ったかのバカが適当に答えてるだけだよw
見ててわかるからおもろいw
0402名無しさん@お腹いっぱい。2014/03/01(土) 19:15:34.15
と、低レベルがうなってます
0403名無しさん@お腹いっぱい。2014/03/01(土) 21:37:01.64
>>400
変数strを使う場合はどうですか?
sed '/hoge/a $str' -i file だとstrの中身が返らないし
sed "/hoge/a $str" -i file だとエラーになるんですよね。
結局strの中身の特殊文字をうまくエスケープしておかないと駄目みたいで、面倒だなぁと前から思ってまして。

別にsedに拘っているわけではないです。とりあえず今はこんなふうにして凌いでいます。

cat > file2 <(sed -n "1,/hoge/ p" file) <(cat << EOF
文字列1
文字列2
・・・
文字列n
EOF
) <( sed -n "/hoge/,$ p" file | tail -n +2 ) ; mv file2 file

いまいちカッコ悪くて気に入りません。
それに file が巨大な場合は2回sedをかますのは非効率的だろうし。。。

この手の挿入処理はよくあるテクだと思うので、他にもっと良い方法があるんだろうと思ってたのですが。
0404名無しさん@お腹いっぱい。2014/03/01(土) 21:51:22.31
sedが駄目ならawk使えば

hoge='ho$ge
fu/g"a
piyo'

echo "apple
banana
orange" | awk -v hoge="$hoge" '{print}/banana/{print hoge}'
0405名無しさん@お腹いっぱい。2014/03/01(土) 22:04:11.17
>>404
おぉ、そんな方法が!awkに変数をまるっと渡せるのがミソですね。
ありがとうございました。
0406名無しさん@お腹いっぱい。2014/03/01(土) 23:48:56.90
shでechoの出力先をデフォルト標準出力、ファイル指定されてたらそのファイルと言うことをしたいのだけど。
/dev/stdoutがsuした後だと使えません。

出力先が指定されているかいないかで分岐して同じechoすればいいだけなのだけど、
分岐なしでいけるクールなやり方ありませんか?
0407名無しさん@お腹いっぱい。2014/03/02(日) 00:07:17.74
良く分からんが exec 1> file とかじゃ駄目なのか
0408名無しさん@お腹いっぱい。2014/03/02(日) 02:09:02.35
>>398
「できれば」以降がよくわからんけど・・・
Perlで全文読みきって正規表現で置換するワンライナー書けばいいと思う
Perlの正規表現なら改行文字を含んで複数行のマッチが書ける

sedでも出来る気はするけどsed使うの苦手なんで他の人にパス
0409名無しさん@お腹いっぱい。2014/03/02(日) 04:18:36.46
>>408
sed使うの得意じゃないが >>403 のように変数じゃなくて構わないなら
$ sed "/hoge/ {
a 文字列1
a 文字列2
a ・・・
a 文字列n
}" <file

とか,一旦ファイルに落としてこんな感じとか

tmpfile=`mktemp`
trap "rm -f $tmpfile" EXIT
echo -n "$str" >$tmpfile
sed "/hoge/ r $tmpfile" <file

それも嫌ならこんな形?

sed "/hoge/ r /dev/stdin" -i f1 <<EOF
$(echo "$str")
EOF
0410名無しさん@お腹いっぱい。2014/03/02(日) 05:08:57.04
あー>>404さんの方法、マッチする/banana/の部分も変数で渡したい場合は駄目でした。
/ /の中身は正規表現で解釈されちゃうからエスケープが必要ですねorz

hoge2='hoge$hoge'

echo "apple
banana
orange" | awk -v hoge="$hoge" -v hoge2="$hoge2" '{print}/hoge2/{print hoge}'


>>408
「できれば」というのは、挿入したい文字列をそのままの形でスクリプトに書いておいて、
その後の挿入処理もsedなどで華麗にワンライナーで書きたい、という願望です。

perlならできるのでしょうか。ゴミみたいな知識しかないので少し勉強しなきゃ。。
0411名無しさん@お腹いっぱい。2014/03/02(日) 06:19:37.58
>>409
/dev/stdin からsedに流せるとは驚きました!
そして、これで目的の処理がsedでできました。ありがとうございます。
以下、テストスクリプト

#!/bin/sh
searchLine=$(cat << 'EOF'
hoge'"$&hoge
EOF
)
insertLines=$(cat << 'EOF'
#### insertLine ####
#### insertLine #### '"$&%=@+-*/[](){};:!
#### insertLine ####
EOF
)
cat > f1 << 'EOF'
1: fuga
2: hoge'"$&hoge
3: fuga
EOF
sed "/$searchLine/ r /dev/stdin" f1 << EOF
$(echo "$insertLines")
EOF

結局sedに戻ってしまった。。。
sedは行マッチの / / が正規表現ではなく固定文字列というのが、この場合丁度良かったということですね。
0412名無しさん@お腹いっぱい。2014/03/02(日) 06:26:32.79
>>411
一つ補足します。
sedに渡すための searchLine に / が含まれるとsedでこけてしまう。やはり万能ではないか。。。
というかこの手の処理を完璧に汎用的にするというのは、もしかして不毛な考えなのでしょうか。

さらにおまけの補足ですが、>>404さんのようにechoの標準出力を>>411のsedへ渡す場合は、
そっちも/dev/stdinだと解釈されてしまいますね。本筋の話ではないですが。
04134082014/03/02(日) 06:47:52.02
399以降読まずに408を投稿してもうた・・・
>>410
なる。メタ文字含む複数行文字列が、挿入文字列じゃ無くて検索文字列だと勘違いしてたわ
perl -pe '$_=$_.$ENV{挿入文字列変数名} if index($_,$ENV{検索文字列変数名})>=0'
検索文字列も素の変数使うって事なら↑挟めばいいと思う
改行関連は↓にするとか「-pe」を「-lpe」にするとか挿入文字列の前後の改行で調節とか色々
perl -pe '(chomp,$_=$_.$ENV{挿入文字列変数名}) if index($_,$ENV{検索文字列変数名})>=0'

>>412
Perlなら環境変数にさえ値を入れられれば問題なく処理できるかとー
テストコード貼ろうかと思ったけどヒアドキュメント版は改行多すぎぃ!
0414名無しさん@お腹いっぱい。2014/03/02(日) 08:13:38.92
ここでは関数使ってブラックボックスにするのはアウトなんですか
0415名無しさん@お腹いっぱい。2014/03/02(日) 10:59:50.58
どうしようsedとAWKとPerl
Perl覚えたらsedとAWKでできるテキスト処理できるらしいじゃん
ワンライナーだけでも覚える価値あるかな?
0416名無しさん@お腹いっぱい。2014/03/02(日) 11:21:08.85
sedは s/hoge/fuga/ が用途の99%占めてるし
awkは {print $2} が用途の99%占めてるから憶えるまでもない
それを越える複雑な処理したい場合は素直にperlとか使うべし
0417名無しさん@お腹いっぱい。2014/03/02(日) 11:30:00.95
最近はxmlstarletも便利だけど、webだとパースできるページ少ない。
0418名無しさん@お腹いっぱい。2014/03/02(日) 14:51:52.22
>>398
特定文字列にマッチというのが正規表現なら
perl -e 'while (<STDIN>)
{
print;
if (/$ARGV[0]/)
{
print "$ARGV[1]";
}
}' "$pattern" "$insert" < file

文字列の比較なら
awk -v pattern="$pattern" -v insert="$insert" '{print} $0 == pattern {print insert}' file

て感じでどうだろう
0419名無しさん@お腹いっぱい。2014/03/02(日) 17:15:59.79
>>407
指定されてたら複製させる感じか。
明日試してみます。
0420名無しさん@お腹いっぱい。2014/03/02(日) 17:23:58.94
>>413
perl使うのなら
BEGIN{undef $/;} s/(Q${検索文字列}E)/$1${挿入文字列}/g
とかじゃダメなん?
0421名無しさん@お腹いっぱい。2014/03/02(日) 17:59:50.17
>>413,418,420
ありがとうございます。
perl全くの無知なんで勉強してみます。

# perlってなんか独特で敬遠してたのよね。。。sedやawkでできない場合に困るし、やっといたほうがいいな
0422名無しさん@お腹いっぱい。2014/03/02(日) 18:25:13.98
perlはもう10年書いてないけど困ったことはないな
rubyとpythonが書ければ何とかなる
0423名無しさん@お腹いっぱい。2014/03/02(日) 18:31:34.17
/usr/localのインストールは禁止されてるので、perlはあり得ない。
普通に sed awk あるいはシェルのみで書く。
0424名無しさん@お腹いっぱい。2014/03/02(日) 18:36:54.21
僕はnode.jsでいいです
■ このスレッドは過去ログ倉庫に格納されています