5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

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

【sed】シェルスクリプト総合@LINUX Part2【awk】

1 :ミスターバッシュ:2006/08/03(木) 13:10:00 ID:5dVnjkpT
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

前スレ
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

233 :login:Penguin:2006/11/18(土) 23:42:31 ID:2K6k+fAl
paste - -


234 :login:Penguin:2006/11/18(土) 23:43:40 ID:KEL72rWc
>>224
bsh系で挙動が違うものの代表格だな。

kshだと、局所化されない。
bsh(V7やSolarisなど)は、局所化される。
bashも局所化される。

一方↓の場合、
while read hoge
do

done < fugafile

bsh(V7やSolarisなど)は、局所化される。
ksh、bashだと、局所化されない。



235 :login:Penguin:2006/11/19(日) 01:07:47 ID:75ySYxGK
>>231 >>233
ありがとうございます!めっちゃ感動しました

>>232
実はCygwinでやってるのだけれどcolumnコマンドが入ってなくて・・・

236 :login:Penguin:2006/11/19(日) 11:08:03 ID:PNiLk3lU
>>233
その手は知らなかった。

237 :login:Penguin:2006/11/21(火) 17:25:32 ID:RPVTOsSL
シェル関数について質問なのですが、シェル関数実行時に標準出力をファイル等にリダイレクトした場合には、
その関数はサブシェルで動作するとなっているのですが、何度試してもカレントシェルでの動作になります。
これは正常な動作なのでしょうか?
それともシェル関数をサブシェルで動作させるには他に何か条件があるのでしょうか?
因みにシェルはbashを使っています。

238 :あほ初心者:2006/11/22(水) 00:12:00 ID:IxrPWlIp
すいません
while文を使用したループで[条件1]もしくは[条件2]の場合ループを抜けるという
or条件を指定したいんですけど、
やり方が判らないです。。。。


どなたか教えてください。
↓↓↓の条件の[ $a -lt 3 ]に[&b_flg = "OFF"]というor条件を追加したい感じです。


-----------------
#!/usr/bin/

a=1

while [ $a -lt 3 ]
do
a=`expr $a + 1`
done

239 :login:Penguin:2006/11/22(水) 00:14:15 ID:bnqD2I+t
while [ $a -lt 3 -o b_flg = "OFF" ]

man test

240 :login:Penguin:2006/11/22(水) 00:16:08 ID:Q3Q+e0H3
whileで指定するのは、ループを「続ける」条件。

241 :login:Penguin:2006/11/22(水) 00:22:03 ID:bnqD2I+t
>>240
裏を取れば終了条件。
応用力0すか?

242 :login:Penguin:2006/11/22(水) 00:31:45 ID:8zJkxMvj
単に訂正しただけっしょ。

243 :login:Penguin:2006/11/22(水) 00:32:08 ID:JDMO7VWz
初めまして。突然失礼します。
学校の課題なのですが・・・

「ディレクトリ、/usr/binにある全ての実行可能ファイルのman一行出力をテキストファイルに書き出す。ファイルの数は膨大なので、スクリプトを書いて処理すること。」

このシェルをつくらないといけないんですけど
どなたか教えてください><

244 :login:Penguin:2006/11/22(水) 00:47:21 ID:2GKTJH4U
そりゃいかんだろ。しかも、何にも知らない学生に出すような課題じゃないし、せいぜい悪あがきすることだ。

245 :あほ初心者:2006/11/22(水) 00:49:03 ID:IxrPWlIp
レス有難うございます。

>>239
これやってみたら無限ループしちゃいました(泣)

>>240

カウンターが3未満の場合、かつフラグが"OFF"の間ループさせたいのです・・・・。

246 :login:Penguin:2006/11/22(水) 00:57:36 ID:jTQUwjrV
>>243
その課題、前にどっかのスレで見たな。
過去に同じ質問をしたおバカな先輩がいるみたいだな。w


247 :login:Penguin:2006/11/22(水) 01:29:46 ID:tazRDaIV
>>243
シェルって言うな。
教えてやんない。

248 :login:Penguin:2006/11/22(水) 01:48:04 ID:hxP9MaWC
>>243
ls /usr/bin | (while read f ; do whatis $f ; done) > shell_tte_iuna_baka.txt

249 :login:Penguin:2006/11/22(水) 09:10:37 ID:+iDbTTrl
>>239
×b_flg = "OFF"
◯$b_flg = "OFF"
でしょ。

>>245
>かつフラグが"OFF"の間
"かつ"ならor条件じゃなくand条件でしょ。
while [ $a -lt 3 -a $b_flg = "OFF" ]


250 :login:Penguin:2006/11/22(水) 09:55:53 ID:V6McRbrX
自分がスクリプト書くときは、繰り返す場合いっつもforつかいます。
それは、なんらかのバグがあったときにforならあるところまでで必ず止まるという
安心感があるからです。

ところが、このスレではwhileを使っている人を結構見掛けるのですが、
どういう時に繰り返し処理をwhileで書こうと考えているのでしょうか?

251 :login:Penguin:2006/11/22(水) 10:23:48 ID:UPqdXOUd
>>250
なんだなんだ?確認するが「シェル」スクリプトの話でいいんだよね?

forとwhileじゃ意味がずいぶん違うじゃん。whileは変数を束縛しないでしょ。
それと、実行前に範囲が決まらない処理なんていくらでもある。

252 :login:Penguin:2006/11/22(水) 10:27:53 ID:V6McRbrX
>>251
例えばtest1、test2...みたいなファイルを消す場合は

for i in `seq 1 1 9`; do rm test$i ; done
rm -f test??

みたいな感じでシェルスクリプト書いてるんですよ。
なんかバグってwhileで意図しないファイルまで消されてしまうような気がして、
あんまりwhileを使いたくないんです。気分的に。

ただ、whileならではの利点みたいなものが見えれば、whileを勉強する意欲が
湧くかなって思ったので、そのwhileの魅力みたいなモノがあれば教えていただければ
と思いました。

253 :login:Penguin:2006/11/22(水) 10:29:59 ID:hxP9MaWC
>>250
for(i = 0; i < MAX; i++) {
    printf("infinite loop\n");
    $i = 0; /* this code is fatal bug */
}

上記の通り、バグで止まるかどうかという意味ではforも同じです。
使い分けは、ループの意味で分けるのが可読性の観点で好ましいかと。
一定回数カウント、もしくはイテレータで繰り返してループするものにforを、
回数不定で特定の条件を満たすまでループするものにwhileを、というのが
一般的かと思われ。

254 :login:Penguin:2006/11/22(水) 10:38:06 ID:hxP9MaWC
ごめんCのこと書いた。

255 :login:Penguin:2006/11/22(水) 10:40:40 ID:V6McRbrX
>>253-254
なるほど、whileの使い分けとしては回数で止めるか、条件で止めるかということですか。

でもなんだろう、この自分の中の漠然としたwhileに対する不安感は、やっぱり
使ったことが無いからなのかもしれないですね…
whileの練習もかねて意識して使うようにしてみます。
ありがとうございましたm(_ _)m

256 :login:Penguin:2006/11/22(水) 14:15:34 ID:pcMmUayC
変数に"/"が入っている文字列を"/"部分だけ
"\/"にしたいのですが、
sedでできません。
誰か良い方法をご存知でしょうか?

test=test1/test2
sed "s/\//$test/g"

【実行結果】
sed: 1: "s/\//test1/test2/g": bad flag in substitute command: 't'


257 :login:Penguin:2006/11/22(水) 14:45:17 ID:o0UyRkyX
一番手っ取り早いのは、
sed "s|/|$test|g"


258 :login:Penguin:2006/11/22(水) 20:58:02 ID:/ICllq1f
誰も突っ込まないのは…釣り?


259 :login:Penguin:2006/11/22(水) 21:47:57 ID:bnqD2I+t
>>258
アホか。

260 :login:Penguin:2006/11/22(水) 22:14:13 ID:o0UyRkyX
しまった。つられた。

test=$(echo $test | sed "s/\\//\\\\\//g")
バッククォートなら、
test=`echo \$test | sed "s/\\\\//\\\\\\\\\\//g"`


261 :login:Penguin:2006/11/23(木) 00:05:41 ID:cxW9On4t
折角のLinux板なので
${test//\//\\/}
なんつーbash限定の方法は如何?


262 :login:Penguin:2006/11/23(木) 07:59:05 ID:CuFvrJz+
sugeeeeee

263 :login:Penguin:2006/11/23(木) 17:33:38 ID:RM/e3Lly
ぜんぜんすごくない。
典型的なキモい拡張の代表格じゃん。


264 :login:Penguin:2006/11/23(木) 18:51:01 ID:CuFvrJz+
>>263
別にお前がすごいと思おうが思わないだろうが関係ないよ。
俺がすごいと思っただけだから。

265 :login:Penguin:2006/11/23(木) 21:37:51 ID:9rWiEH/g
>>264
そして、そんなお前を俺はダセェと思ったんだ。


266 :login:Penguin:2006/11/23(木) 21:45:03 ID:i/t/5yj6
bash 限定なら便利だよね。

267 :login:Penguin:2006/11/24(金) 15:37:53 ID:QetvQUTA
こんにちは。

19/Nov/2006
19/Nov/2006
20/Nov/2006
21/Nov/2006
21/Nov/2006
22/Nov/2006

なファイルがあり、それぞれ数えて

19/Nov/2006 2
20/Nov/2006 1
21/Nov/2006 2
22/Nov/2006 1

としたいのですが、どすればいいでしょうか?ヒントでも良いので
お願いします!



268 :login:Penguin:2006/11/24(金) 15:50:58 ID:q4M0kGa+
uniq -c

269 :login:Penguin:2006/11/24(金) 15:56:39 ID:QetvQUTA
>>268
こんなに早く解答を頂いて、本当にありがとうございます!
とても助かりました。

270 :login:Penguin:2006/11/24(金) 18:24:46 ID:oYJh4kFu
test="A<タブ>B<タブ>C"
echo "$test" | while read in line
do
echo "$line"
done

を実行すると、
B<タブ>C
となってしまいます。

A<タブ>B<タブ>C
と得るにはどうしたらよいでしょうか?


271 :login:Penguin:2006/11/24(金) 19:13:41 ID:ZfQxSWxT
>>270

1. while read line

2. echo "$in<タブ>$line"

3. IFS='
'

好きなの使え

272 :あほ初心者:2006/11/25(土) 00:30:44 ID:PS7K2G+h
>>249

返事遅れてスイマセン。。。。
書いてある条件でやったらできました。-aや-oの指定方法理解できました。

有難うございました

273 :login:Penguin:2006/11/26(日) 05:31:22 ID:AL6bt30h
sedはignorecaseでのマッチングはできないんでしたっけ?

274 :login:Penguin:2006/11/26(日) 08:58:39 ID:pXTU5C4T
>>273
/regexp/I
とか
s/regexp/replacement/I
とか


275 :login:Penguin:2006/11/26(日) 12:59:06 ID:AL6bt30h
>>274
どうも。GNU拡張だったみたいですね。

276 :login:Penguin:2006/11/26(日) 13:11:11 ID:FneAj50i
sed、awk、tar、cpioはgnu版が一番。


277 :login:Penguin:2006/11/26(日) 13:14:41 ID:LjpahU1Z
GNU 版以外になんかあったっけ。

278 :login:Penguin:2006/11/26(日) 16:06:21 ID:bXQDH3xo
awkはgawkだよね < 正式名称(?)
tarもgtarだ

sedとcpioは?

279 :login:Penguin:2006/11/26(日) 20:31:37 ID:gEHgbYsL
>>278
gsedとicpo

280 :login:Penguin:2006/11/27(月) 00:15:49 ID:UE44ZgMS
>>278
http://www.gnu.org/software/tar/
別に gtar が正式名称ってわけじゃない。
OS 標準の tar が別にある場合に
それと区別するために
gtar というコマンド名でインストールされることがある、
ってだけ。

sed も cpio もそのまんま。
http://www.gnu.org/software/sed/
http://www.gnu.org/software/cpio/

281 :login:Penguin:2006/11/27(月) 01:47:31 ID:bWyCbzl1
ggrep …ぐぐれっぷ。

282 :login:Penguin:2006/11/27(月) 02:14:33 ID:B8mdaK4S
BSD系はGPL汚染を避けるために独自のunix toolそろってるよね。
今でも完璧にGPLフリーなの?

283 :login:Penguin:2006/11/27(月) 02:24:39 ID:UE44ZgMS
>>282
C コンパイラは gcc 使ってなかったっけ。
まぁ、詳細は UNIX 板で聞いてくれ。

284 :login:Penguin:2006/11/27(月) 02:25:13 ID:UE44ZgMS
GPL 汚染を避けるためってより
元からあるのを使い続けてるだけ。

285 :login:Penguin:2006/11/27(月) 02:46:22 ID:cP0Kjc7q
sedでもなんでもいいですけど、
ABC
DEF
GHI
という改行入りの文字列を
ABCDEFGHI
としたいのですが、
231 を真似て、
sed -ne 'N;s/%\n//;p'
としてみましたが、
ABC
と一行の場合は、空白になってしまいました。

どうすれば実現できますか?


286 :login:Penguin:2006/11/27(月) 03:00:07 ID:OelJATmM
>>285
while read line;
do
echo -n "$line"
done <<END
ABC
DEF
GHI
END

echo
----
とかではあかんの?

#>>285さんもお仕事中ですか?
#私の方は目途が付いたのでそろそろ仮眠入ります(=.=)

287 :login:Penguin:2006/11/27(月) 07:10:55 ID:Jc9GP2Cc
> 280さん
そうなんだ
正式名称ってわけではないのっすね
Solarisでびっくりした記憶が

むぅ
ねむい


288 :login:Penguin:2006/11/27(月) 07:50:47 ID:bqAw+xNf
>>285
tr -d "\n"

289 :login:Penguin:2006/11/27(月) 22:38:33 ID:0CtuQywK
アホな初心者なんだけど教えて!

$Aと$Bにはそれぞれ時刻が(xx:xx:xx)の形式で格納されているんだけど
これを$Aと$Bの比較を行いそれぞれ条件分岐で表現させたいんだが
どうすればいいだろう?

if文でずっと考えていたんだが
文字列と数列演算の比較しか調べても出てこなかった。

290 :login:Penguin:2006/11/27(月) 22:54:05 ID:Bw+6GoCc
>>289
$A と $B を date コマンドで変換して比較するとか。

date -d "$A" '+%s'

291 :login:Penguin:2006/11/27(月) 23:06:21 ID:Gl6W36sR
xxの部分が必ず二桁であるなら、言い換えれば、コロン除いて必ず6桁であるならば、

[ "`echo \$A|sed \"s/://g\"`" -eq "`echo \$B|sed \"s/://g\"`" ]
とか。

bash依存でいいなら、
[ ${A//:} -eq ${B//:} ]



292 :login:Penguin:2006/11/27(月) 23:09:28 ID:bqAw+xNf
>>289
:を削除すればいい

293 :login:Penguin:2006/11/28(火) 00:06:04 ID:9U2/5wlL
感動した

294 :login:Penguin:2006/11/28(火) 00:23:02 ID:fFcPBnEd
あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの?
例えば、

aaa aaa aaa
aaa aaa aaa
abc 1 2
abc 3 4
bbb bbb bbb

というファイルを

abc 1 10
abc 3 20

と言うファイルを使って

aaa aaa aaa
aaa aaa aaa
abc 1 2 10
abc 3 4 20
bbb bbb bbb

にしたいんだけど。。
どえらく行があって普通にsedの置換する行を書かせて実行したら
一日で終わらないくらい時間がかかってしまって。。。
もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか?

偉い人教えてください。

295 :login:Penguin:2006/11/28(火) 00:37:14 ID:ve7hOhUi
sed -e 's/abc 1 2/abc 1 2 10/gc' -e 's/abc 3 4/abc 3 4 20/gc' <input.txt
とか。

296 :login:Penguin:2006/11/28(火) 00:54:27 ID:S83lGj9/
>>295
そのabc 1 2ってところがファイルの内容によって変わるから-eでは指定できなくて
困ってんじゃないの。

俺ならperlに逃げるが、...
どうしてもsedでやるなら、「2番目のファイルから>>295のようなsedスクリプトを
生成する」というスクリプトをsedなりawkなりで書くんだろうな。


297 :login:Penguin:2006/11/28(火) 01:38:28 ID:hlMS5leM
294だけどそれを数だけ書いて実行したらどえらく時間がかかってしまって…

298 :login:Penguin:2006/11/28(火) 02:13:27 ID:S83lGj9/
マルチ。
ttp://pc8.2ch.net/test/read.cgi/tech/1112553783/

速度向上の話はシェルスクリプトの話というよりアルゴリズムの話なのでは。
そっち方面のスレの方が相手にしてもらえる。

遅いだろな。>>296-297の話だと「1番目のファイルの行数×パターンファイルの行数」
回だけパターンマッチを繰り返すんだからさ。

パターンが正規表現じゃなく固定文字列&対象フィールド固定でいいみたいだから、
ハッシュ表の応用が吉。2番目のファイルのパターン指定部分をkeyとして、
dbmとかRDBとかいろいろ速い方法がある。

299 :login:Penguin:2006/11/28(火) 07:24:19 ID:tF5D3BVE
タグで抽出してからいじれ

300 :login:Penguin:2006/11/28(火) 15:20:17 ID:OR43oAVg
いずれにせよ行指向なシェルスクリプト+αにゃ不向きだな。
置換したい行の位置が変わってもよければまだなんかありそうだが。

301 :login:Penguin:2006/11/30(木) 15:18:39 ID:qADJb4/Z
シスログなどのファイルからエラー項目を取り出して、
対象となるデーモンをリスト化したファイルとマッチさせて
対象があれば正という処理をしたいんですが
参考となるスクリプトを掲載したHPはありますか?

考えられるキーワードでググっても出てこないので
困ってます。

302 :login:Penguin:2006/11/30(木) 15:29:18 ID:VjTlzCpk
grepで済むと思うが

303 :login:Penguin:2006/11/30(木) 15:48:37 ID:qADJb4/Z
で、問題はこれを5分間隔でやっているので
その間に発生したエラーログのみ監査対象が限定されるのです。

シスログの日付とlocaltimeを比較しないとダメなんです。

304 :login:Penguin:2006/11/30(木) 19:53:42 ID:5H/Ib3vS
ならdateとgrepで済むと思うが

305 :login:Penguin:2006/11/30(木) 20:45:11 ID:bn6C4MA9
>>303
最近のsyslogdなら、名前付きパイプに対応してる。
FIFO経由で順次処理の方が良いんじゃね?


306 :login:Penguin:2006/12/01(金) 19:53:40 ID:gsraXxcw
ところで、シスログなどのファイルをリストとして読み込むには
皆どう処理してる?

307 :login:Penguin:2006/12/01(金) 23:24:27 ID:+exVUFbt
>>294
awkで書いて見た。久しぶりに使ったけど便利だな。
BEGIN{
while( getline p < ARGV[1] >0){
split(p,a," ")
word[ a[1] + a[2] ] = a[3]
}
ARGV[1] =""
}
{
if( word[ $1 + $2 ] != "" ) {
print $0 " " word[$1 + $2]
} else print $0
}


308 :login:Penguin:2006/12/02(土) 11:18:13 ID:MFbNlyXD
>>307
ちょっとだけ修正
word[$1 + $2]は
word[$1 + " " + $2]の方がいいかも
word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1"と"ab"+"c1"が両方とも"abc1"になってしまう。
>>294のように文字数が一定なら問題ないけど。
まあ実用にするんだったらもっとあちこちいじらないとダメだな。

309 :login:Penguin:2006/12/02(土) 14:12:26 ID:9wM9eGR+
>>307,308
それマルチ
http://pc8.2ch.net/test/read.cgi/tech/1112553783/448
http://pc8.2ch.net/test/read.cgi/tech/1112553783/453-456

つーかよく仕様を読み取ったな。
あっちのスレで追加ヒントを出されたけど
全く法則性をつかめなかった。IQ低いんだな>オレ

310 :login:Penguin:2006/12/02(土) 15:15:50 ID:IOXyzmke
一万行あったら終らない。

311 :login:Penguin:2006/12/02(土) 16:40:12 ID:h1TrJh+k
スクリプトでなんともできない量なんだったら、
いっそCで組むなりDBにいっぺんつっこんでなんかで処理するなりしたほうが。

>>303
1. いっぺんログ(a)を全部コピる(b)
2. 5分たったら(b)の行数分だけ(a)からはじいて更新行だけ抜く(wcなりtailなりdiffなり)
3. 抜いたものに処理かまして1.に戻る

312 :login:Penguin:2006/12/02(土) 17:04:04 ID:6y2Ykjot
以下のような配列から

20061201120000 **** ***** ****
20061201130000 **** ***** ****
20061201132000 **** ***** ****
20061201132100 **** ***** ****

while文で上のリストを読み込んだときに
左1番目の日付記録と現在の記録を比較して
5分以内のみを取り出して別のファイルに読み込ませる
ということを行いたいです。

whileとifの組み合わせでうまくいかないんですが
皆さんならどう書きますか?

313 :login:Penguin:2006/12/02(土) 17:28:33 ID:h1TrJh+k
まずは自分がどう書いたかだ。

314 :308:2006/12/02(土) 18:00:30 ID:RMFwKrIK
>>308
おおボケかましてた。
>word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1" は 1 だった。
+を抜いて word[$1 " " $2]こうしないと
BEGIN{while(getline < ARGV[1]) word[$1 " " $2] = $3; ARGV[1] = ""}
{ if(word[$1 " " $2]){ $4 = word[$1 " " $2]
#ここも追加
}else delete word[$1 " " $2];
print $0
}

END{for( s in word) print s "=" word[s];}
これで見るとif(word[$1 " " $2])の時にwordに追加されるようで
でかいファイルでやってたらメモリが足りなくなる。でdelete を追加。
>>294のデータでのテストならちゃんとした結果が出るが
実際のデータでやってたらおかしな結果になったんだろうな。
危ない危ない。もうない事を祈ってorz

315 :login:Penguin:2006/12/02(土) 18:08:46 ID:HEbI++rQ
ふつーに word[$1, $2] でいいのではないかと。
多次元配列のように見えるけど、実体は word[$1 SUBSEP $2] という
組み込み変数 SUBSEP で連結しただけの1次元配列。


316 :login:Penguin:2006/12/02(土) 21:01:28 ID:6kGljnD5
こんな感じかな?

gawk 'BEGIN{ filt=strftime("%Y%m%d%H%M%S",systime()-300) } $1>=filt{ print }'  < 元ファイル > 新ファイル名

317 :login:Penguin:2006/12/03(日) 00:26:39 ID:A8uHmA87
>>312
(d=`date -d -5min +%Y%m%d%H%M%S`; while read l r; do if [ "$l" -gt "$d" ]; then echo "$l $r"; fi; done) < list > other

318 :312:2006/12/03(日) 13:51:58 ID:N72hre3c
>317
ありがとうございます。

私は今こんなスクリプトで書いていますが検討もつきません。


cat /var/log/errlog | sed -e "s/Jun/1/g" | sed -e "s/Nov/11/g" | sed -e "s/://g" | awk '{print $1$2$3}'

これらをwhileでまわしてどう比較させるのか、まったくわからん・・

319 :login:Penguin:2006/12/03(日) 14:14:55 ID:73paMa8k
>>312と違うじゃねーか

320 :login:Penguin:2006/12/03(日) 14:16:41 ID:73paMa8k
ああ現在の記録の方か

321 :login:Penguin:2006/12/03(日) 14:28:51 ID:0bKgPd66
質問です。

a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

のような内容のファイルがありまして、最後の.から右側だけを取り出したいのですが、
sedだとどうやるんでしょうか。

$ sed -e '/^(.*)\.(.*)/\2'

のようなやり方だと、後方参照の数字が分からないで困ってます。


322 :login:Penguin:2006/12/03(日) 15:45:30 ID:Wi7dHq2/
\.([^\.]+)$

323 :login:Penguin:2006/12/03(日) 16:23:52 ID:/7urMGDU
それ何てAA?

324 :login:Penguin:2006/12/03(日) 16:24:47 ID:Wi7dHq2/
\.([^\.]+)$ プギャー

325 :login:Penguin:2006/12/03(日) 17:48:15 ID:/7urMGDU
>>324
ご本人殿、馬鹿に付き合ってくれてありがとう

326 :321:2006/12/03(日) 17:50:37 ID:0bKgPd66
>322
ありがとうございます。

しかし、

$ cat list | sed -e 's/\.\([^\.]+\)$/\1/'
a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

となってしまいます。何故だろう。

327 :login:Penguin:2006/12/03(日) 17:56:48 ID:Wi7dHq2/
>>326
括弧をエスケープしている理由は?

328 :login:Penguin:2006/12/03(日) 17:59:35 ID:73paMa8k
sed 's/^.*\.//g'

329 :login:Penguin:2006/12/03(日) 18:00:43 ID:73paMa8k
あgいらんわ

330 :login:Penguin:2006/12/03(日) 18:24:02 ID:wqiGXln8
foreach line (`cat file`)
foreach> echo $line:e
foreach> end

とかいう技がある。csh/zsh だけどね。

331 :login:Penguin:2006/12/03(日) 23:38:29 ID:tvcBgjra
IFS=.
while read line
do
set set ${line}
eval "echo \"\$$#\""
done

POSIX な sh なら動くと思われ。
取り敢えず、ash/ksh/bash それと emulate sh/emulate ksh な zsh では確認。


332 :login:Penguin:2006/12/04(月) 16:05:09 ID:+d1incKQ
cut -d\. -f2- list
が最短?

160 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)