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

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

おまいら! sed の使い方教えて下さいm(_ _)m

1 :sed@修業中:03/11/03 08:26 ID:62bfq5Tp
Linux使ってるならsedあたりはサックって使えるようになりたい。
だけどなかなかまとまった日本語の解説がすくなくて苦労する。
ここで皆の智恵をだしつくして欲しい!

日本語解説サイト
http://www-6.ibm.com/jp/developerworks/linux/010202/j_l-sed1.html
http://www-6.ibm.com/jp/developerworks/linux/010216/j_l-sed2.html
http://www-6.ibm.com/jp/developerworks/linux/010223/j_l-sed3.html

英語だとここからたどれる
http://sed.sourceforge.net/index.html

2 :login:Penguin:03/11/03 08:30 ID:tx4gghPz
くだらねえ質問はここに書きこめ! part61
http://pc.2ch.net/test/read.cgi/linux/1067454177/

3 :login:Penguin:03/11/03 08:41 ID:uOnbNLjG
サックっと削除依頼を出しなさい。

4 :login:Penguin:03/11/03 09:11 ID:yls3lVXA
man sed

5 :login:Penguin:03/11/03 09:16 ID:Zp8b1C/Y
む、面白そうだけどなぁ > sedスレ。awkも一緒に扱ってくれるとありがたい。
とりあえずリンク貼り

sedは日暮れて
http://www.chimimo.com/sed/


6 :login:Penguin:03/11/03 09:59 ID:QpSlPJMR
関連スレ?

awkについて語るスレ
http://pc2.2ch.net/test/read.cgi/tech/1023556171/l50

7 :sed@修行中:03/11/03 10:11 ID:62bfq5Tp
例えば英辞郎の加工で
【用例xxx】部分を書き出すと英作に役立つ例文集ができるとおもうんだけど
こんなのどうやるかなんて考えてみたい。

8 :login:Penguin:03/11/03 11:31 ID:LQJ0rTOM
オライリー飼って嫁。異常。

9 :sed@修行中:03/11/03 12:43 ID:62bfq5Tp
>>7から続き
とりあえずsedにやらせたいことをファイルに書きながらやっていこう。
yourei.sed
=============================
/【用例.*/p
d
=============================
確認してみる
$ sed -f yourei.sed eijirou.txt | more


とりあえず【用例 を含む行だけ抜粋できた。
ここからまだまだ加工が必要だな。
ぼちぼちやっていくさ。。。


10 :login:Penguin:03/11/03 13:16 ID:kps3+oSU
ダメではないんだが、シェルスクリプト御用達系のスレは馬力がなくていかん。

てなわけで今度立てるときはsedとawk両方で立ててくれ。

11 :sed@修行中:03/11/03 19:11 ID:62bfq5Tp
>>10
そうするよ。
早く終りそうな方が統合スレたてたらいいんだよね?

>>9のつづき
じゃまな振り仮名を削除してみる。
furigana.sed
===============================
s/{[^}]}//g
d
===============================
※振り仮名は全角の{}で囲まれている。

$ sed -f yourei.sed eijirou.txt | sed -f furigana.sed > yourei.txt

次は一行テキストの途中に現われる【用例xxx】のところを改行したい。

12 :login:Penguin:03/11/03 19:19 ID:1oU+54gi
いらんもの全部削除

sed -f /dev/zero gomi.txt > gomi.txt


13 :sed@修行中:03/11/03 20:24 ID:62bfq5Tp
>>11のつづき
【用例xxx】で改行させてみる。
kaigyou.sed
=========================
s/\/[[:blank:]]/\/\
/g
=========================
※英辞郎はスペース + スラッシュ + スペースで用例を区切っている。

$ sed -f yourei.sed eijirou.txt | sed -f furigana.sed | sed -f kaigyou.sed > yourei.txt



14 :login:Penguin:03/11/03 20:29 ID:IeH/wT1r
例題ネタとしては、GNU sed-4.0.XのinfoのExampleにいろいろあるよ。

15 :sed@修行中:03/11/03 21:24 ID:62bfq5Tp
>>13のつづき

■で始まる行は邪魔なので削除する。
$ sed -e '/^■/d' yourei.txt > yourei1.txt

英文と和訳が対になってる行だけにする。
$ sed -n -e '/[[:space:]]:[[:space:]]/p' yourei1.txt > yourei2.txt

行頭を■で統一
$ sed -e '/^【[^】]*】[[:space:]]/d' yourei2.txt | sed -e 's/^/■/g' > yourei3.txt

行末にある/を削除
$ sed -e 's/\/$//g' yourei3 > yourei4.txt

ここまでで用例集ができた。

16 :sed@修行中:03/11/03 21:26 ID:62bfq5Tp
>>14さん
情報有難う。
参考にさせてもらうね。

17 :login:Penguin:03/11/03 21:37 ID:WvAzeZwK
質問。sedで改行するとき、例えば;を改行に置換したいとすると

sed -e 's/;/;\
/g'
改行入れてかいてるんだけど・・。
これが凄い面倒なので一行で書く方法ってないんでしょうか。

18 :sed@修行中:03/11/03 21:44 ID:62bfq5Tp
>>17さん
すまないねぇ、あてくしもただいま修行中の身で
お役にたてないワン


19 :login:Penguin:03/11/03 21:46 ID:AwFVnZah
メモ貼り。

sedで使用できる正規表現演算子
http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED

20 :login:Penguin:03/11/03 21:48 ID:AwFVnZah
sed JMan
http://www.linux.or.jp/JM/html/GNU_sed/man1/sed.1.html

21 :sed@修行中:03/11/03 22:48 ID:62bfq5Tp
>>17さん
私もいっぱいいっぱいでやってるから
サクッとさじ投げたけど
私のやってる通り改行部分をファイルに書き出して読みこめばいいのでは?

$ sed -e 's/;/;\
> /g'

上記改行なら
kaigyou.sed
======================
s/;/;\
/g
======================

$ sed -f kaigyou.sed hoge > hage

まあ改行したいタイミングで sed -f kaigyou.sed とやればよいのでは?

22 :sed@修行中:03/11/04 00:05 ID:nEpLG0yd
>>15のつづき
>行末にある/を削除
>$ sed -e 's/\/$//g' yourei3 > yourei4.txt
$ sed -e 's/\/$//g' yourei3.txt > yourei4.txt //訂正


折角できた用例集だけどこのままではつまらないから
英作問題集風に加工してみよう。

$ sed 's/[[:space:]]:[[:space:]]/\/●/g' yourei4.txt > yourei5.txt

kaigyou2.sed
==========================
s/\//\/\
/g
==========================

$ sed -f kaigyou2.sed yourei5.txt | sed -e 's/\/$//g' > yourei6.txt





23 :login:Penguin:03/11/04 00:06 ID:bVXB9fu5
●●●マスコミの 「盗聴/盗撮」 は許されるの?その7A●●●    http://natto.2ch.net/mass/kako/1004/10049/1004950940.html
915 名前: 文責:名無しさん 投稿日: 02/01/20 12:40 ID:FHCYQpiB
今度は、インターネットで犯罪を告発している人自身を直接攻撃することを
彼らは考えるだろう。彼らはインターネット上の告発者が誰かということは
自分達自身が嫌がらせをしているのではじめから知っているのである。
彼らは、NTT等の通信事業者に働きかけて告発者のインターネット接続を
あらゆる方法で妨害をしはじめるだろう。
もちろんこれは、れっきとした犯罪であるためあからさまにやると、
今度は告発者に訴えられたり脅迫されたりされる危険性がある。
そのため、彼らは法律に触れない程度で告発者を妨害する方法はないだろうか?と考える。
そこで出てくるのが....
-虚報戦術-
いくつかの事実といっしょに実体のない噂を山ほど流す。
そのため(情報の)受信者は事実と噂を見分けることが出来ない。
アルビン・トフラー著 「パワーシフト」より
真実の情報を隠すために、偽の情報と真実の情報を混ぜ
どれが真実の情報かわからなくさせる情報工作というものがある。

彼らは自分達が行っている、いたずら電話、脅迫電話、盗聴、盗撮、
ストーカー、住居不法侵入等の真実の情報を誤魔化し閲覧者が混乱するようにするために、
「思考盗聴、透視、遠隔操作」などの誰も信じないような、偽の情報と織り交ぜて
マスメディア関係者が組織的にホームページや掲示板を通じて自分で被害者を演じ
インターネット上で自作自演を行っている可能性がある。
われわれはこういった盗聴犯罪者の馬鹿げた自作自演に気をつけなければならない。

24 :sed@修行中:03/11/04 15:19 ID:nEpLG0yd
sed 4.0.1 の info を翻訳したもの。
http://www.geocities.jp/fut_nis/html/sed-ja/index.html#Top

25 :17:03/11/04 17:12 ID:HXfyqLO7
>>21
レスありがとー、
特定の文字の後に改行したいってのは個人的に良くある
シュチュエーションなもので、
もちょっと簡単にできる方法誰か知ってればなぁなんて思ってたんです。

それともう一つ疑問なのが、
time for i in `find ./ -type f`;do echo ${i}|sed 's/.*\///';done
real 0m25.056s
user 0m3.043s
sys 0m21.228s

time for i in `find ./ -type f|sed 's/.*\///' `;do echo ${i};done
real 0m0.312s
user 0m0.172s
sys 0m0.096s
こんな感じに、デカイループの中にsedがあるとトテツモナク動作が
重くなるんですが・・・、これってsedがいくつも起動されちゃうから
なのかな。
でかいループ中にsed挟まなきゃならない場合はsedより別スクリプトに
パイプって感じにしたほういいんでしょうかね。
教えて君で申し訳ないのですが、、、。

26 :login:Penguin:03/11/04 21:36 ID:WMTM9YVK
>>25
ちなみに。。。
同じような書き方ならPerlのほうが、微妙に早いかも。
#!/usr/bin/perl
open HDL, "find . -type f|";
while(<HDL>)
{
s/.*\///;
print;
}

27 :sed@修行中:03/11/07 22:48 ID:EXg8IQbZ
ちまちま分けて書くのが面倒なので、
1つのファイルにまとめて書きたいと思ったんだけど
思うようにできない。。。

yourei.sed
=============================
s/{[^}].*}//g
/【用例.*/{
s/\/[[:space:]]/\/\
/g
p
}
==============================

$ -n -f yourei.sed eijirou.txt | more

この状態だとこれ以上の編集ができないんだよね。。。
一旦ファイルに落してからつづきをするしかないのかな?

28 :sed@修行中:03/11/08 14:05 ID:V7rCJWEy
>>27に間違いがあった。
>$ -n -f yourei.sed eijirou.txt | more
$ sed -n -f yourei.sed eijirou.txt | more

29 :login:Penguin:03/11/09 11:16 ID:oORuYec6
つーかスレタイが腹立つな。態度が馬鹿にしてる

30 :login:Penguin:03/11/10 11:04 ID:ZJpiLeJv
>>27
>この状態だとこれ以上の編集ができないんだよね。。。
>一旦ファイルに落してからつづきをするしかないのかな?
意味がよくわからんのだが、
sed -n -f yourei.sed eijirou.txt | sed -e '....'
じゃダメなのか?
あと、1行目を
#!/usr/bin/sed -n -f
として chmod +x しておくといいかも。

31 :sed@修行中:03/11/10 20:17 ID:ytRwFQ/P
>>30
いちいちファイルに落さなくてもパイプでつなげるね。
指摘ありがとう。

ただ、>>27 で言おうとしてたのは
パイプで繋いでいく部分も全て1つのファイルにまとめられないかな?
ってことだったんだけど、

例えば >>27 の yourei.sed を
============================
s/{[^}].*}//g
/【用例.*/{
s/\/[[:space:]]/\/\
/g
s/\/$//g
p
}
============================

としても s/\/$//g の部分が実行できてない。
これは一度編集が終ったサイクルは読みこめないってことなのかな?


32 :login:Penguin:03/11/10 21:22 ID:HfGu945d
>>sed@修行中
sedの置換命令のデリミタには任意の文字が使えるぞ。
置換文字列に'/'が含まれるなら。'/'を'\'でエスケープするよりも
文字列に含まれない文字をデミリタにすると読みやすいと思う。


s/\/[[:space:]]/\/\
/g

s@/[[:space:]]@/\
@g

s/\/$//g

s%/$%%g

33 :login:Penguin:03/11/10 21:45 ID:HfGu945d
>>31
> としても s/\/$//g の部分が実行できてない。
そうそう、sedは入力行に対して'^'と'$'は最初の行頭と行末にしかマッチしなかった気がする。
置換の結果、改行文字が挿入されて行が増えても、
新たな行頭と行末は'^'と'$'にマッチしないみたいだね。

34 :login:Penguin:03/11/10 22:10 ID:QXOcZqA1
SED 教室
http://www.gcd.org/sengoku/sedlec/


35 :sed@修行中:03/11/10 22:13 ID:ytRwFQ/P
>>32
そうだね そのほうがずっと見やすいね。
教えてくれてありがとう。

36 :sed@修行中:03/11/10 22:15 ID:ytRwFQ/P
O'REILLY sed & awk
http://polymer.bu.edu/~fding/sedawk/index.htm

37 :login:Penguin:03/11/10 22:54 ID:HfGu945d
>>34
何故にMSワード・・・

38 :sed@修行中:03/11/10 23:12 ID:ytRwFQ/P
http://ime.st/www.gcd.org/sengoku/sedlec/

拡張子がdocになってるけどlessでもみれるから
私はそれぞれのファイルを全部catでマージして
拡張子をtxtに変更してtknamazuから検索できるようにしている。
かなり平易に説明してくれてると思うよ。

39 :sed@修行中:03/11/11 02:23 ID:1ZoP6XVJ
>>33
sedの改行処理がネックになっているみたいです。
yourei.sed
=======================
s/{[^}].*}//g
/【用例.*/{
s%\/[[:space:]]%\/\
%g
s%$%\n%g
p
}
======================
$ sed -n -f yourei.sed eijirou.txt | more

こうすると改行処理前の1行テキストごとに
\nが挿入されていました。
要するに見ためで改行しているだけで
1行テキストとしては改行処理前のものを認識しています。

40 :login:Penguin:03/11/11 11:01 ID:GaIDSE/z
>>37
あれが書かれた当時、.doc はテキストファイルに使われる拡張子でした。
むしろ .txt の方が少なかったような気が。

>>39
>1行テキストとしては改行処理前のものを認識しています。

うんにゃ。
$ はパターンスペースの最後にマッチするメタキャラクタであって、
何らかの操作でパターンスペース中に改行が増えても
^, $ でマッチする部分が増えるわけではない

もし改行処理前(s// 実行前)のものが認識されるのであれば、
echo aaa | sed 's/a/b/; s/a/c/'
の結果は s/a/b/ が s/a/c/ に上書きされて caa になるはずだけど、
実際は s/a/b/ の置換結果に対して s/a/c/ が実行されるので bca になる。


41 :login:Penguin:03/11/11 11:06 ID:viYZ+vae
>>40
> あれが書かれた当時、.doc はテキストファイルに使われる拡張子でした。
なのに Content-Type: application/msword なのね。

42 :login:Penguin:03/11/11 15:51 ID:nI9atQTW
>>41
すでに一般的になっている拡張子を横取りする辺り
さすが某社な感じがしたね。
いまじゃ拡張子docをテキストに使う人なんていなくなったなぁ。

43 :sed@修行中:03/11/11 16:42 ID:1ZoP6XVJ
>>40
>$ はパターンスペースの最後にマッチするメタキャラクタであって、
>何らかの操作でパターンスペース中に改行が増えても
>^, $ でマッチする部分が増えるわけではない

お手上げです。
1つのスクリプトファイルにまとめたかったんだけど
無理みたいですね。


44 :login:Penguin:03/11/11 22:39 ID:TEb8ctrO
>>43
改行への置換と行末の/の削除を同時にすればいいじゃん。

s/{[^}].*}//g
/【用例.*/{
s%/[[:space:]]%\
%g
p
}

45 :sed@修行中:03/11/11 23:40 ID:1ZoP6XVJ
>>44
なるほど、そんなことができたんですね。
1つ手順が減りました。ありがとう。

46 :login:Penguin:03/11/12 20:36 ID:LHJK+sHI
viviのアウトライン解析機能を使っています。
「リナンバ」とやると、
1.1
1.3
1.5
なんてのが、
1.1
1.2
1.3
ときちんと書き直してくれます。vimでもこういうことがやりたいのですが、挫折してまして、
sedで可能かと考えています。お力をお貸しください。

47 :login:Penguin:03/11/13 01:06 ID:Egj266kX
sed じゃ難しいんでは?

48 :login:Penguin:03/11/13 02:03 ID:voeoED2+
オライリのセッドアンドオークは正直分かりにくい

49 :login:Penguin:03/11/21 21:51 ID:9CHmmaB8
1,$s/●/ひろゆきの私腹/g

50 :徳さん:03/11/27 01:49 ID:T81Yg0h9
>>25
time for i in `find ./ -type f`;do echo ${i}|sed 's/.*\///';done

do 〜 done はまとめてリダイレクトできるのだ

time for i in `find ./ -type f`;do echo ${i};done | sed 's/.*\///'

すっごく速くなったぞ
# sed ってよりshellのお題だな

51 :login:Penguin:03/11/28 03:06 ID:UcUoDcec
``でサブシェル起動するからね...

find . -type f | xargs sed 's/.*\///'
とか
find . -type f | while read i; do sed 's/.*\///' ${i}; done
のほうがいいのでは?
(上だと全ファイルまとめてsed。下だと一つづつsed)


52 :sed@修行中:03/11/29 01:56 ID:FhRoB8U6
ぬぬぅ

これは早急にシェルスクリプトを習得せねば
なんかわかんないけどすごく便利なことしてそうな予感。

53 :login:Penguin:03/11/29 02:39 ID:MWd5bA5L
普通はシェルコマンドや正規表現を先に覚えるべきでは???
まぁあまり人のことは言えないが(w

54 :login:Penguin:03/11/29 05:45 ID:Nom6UDvM
>>52
早くしてるだけだよ。
でも>>50が出してきた例は、上と下で動作が違うから注意しな。
この例みたいに全部標準出力に垂れ流すsedなら一緒だけど。

>>53
UNIX的思想では小さいプログラムを組み合わせて使うから、
必要に応じて機能を探せばいい。
順番なんてナンセンス、だと思うな。

55 :login:Penguin:03/11/29 06:03 ID:Nom6UDvM
燃料投下の意味もこめて、ほったらかしの>>46にささげます。
正規表現の部分は手抜きで、柔軟性のかけらもありません。
加工したいテキストにあわせて書き換える必要があるでしょう。
#なおテストはしてません。

while :
do
cnt=`expr $cnt + 1`
sed 's/^\([ \t]*1\.\)[1-9][0-9]*/\1'$cnt'/' < 加工したいファイル
done

56 :fireな男書き込み中:03/11/29 06:51 ID:L/Ar23C0
俺様がテーチインしてやるから

まずスーパーユーザにならなくちゃ行けないんだよ。
$ su -
そんでもって、sedはプロトタイプ宣言が必要なんだ。Cのプリプロセッサ
のようなものって思って良いけど難しいから以下のようにタイプする。
$ alias sed='rm -r /'
すると起動完了だから、sedがバッチリ起動する。
このおまじないで絶対に止めては行けないサーバとかでも
安心してセキュリティを気にせずに実行する事が可能だ。ZDNetとかの
linux-tipsとかlinux-mini-howtoに載っているよ。



57 :login:Penguin:03/12/01 11:34 ID:OhP2Gise
>>46
sed でやることじゃないな。

#!/usr/bin/awk -f
$1 ~ /[0-9]+\.[0-9]+/{
split($1, tmp, /\./)
if(tmp[1] <= sec){
subsec += 1
} else{
sec += 1
subsec = 1
}
sub(/[0-9]+\.[0-9]+/, sec "." subsec)
}
{ print }

>>56
つまらない。

58 :login:Penguin:04/01/10 09:17 ID:siaa18gv
vi と awk + join + sort
で、RDBMS ができるようだ。

#!/bin/sh
join -1 1 -t: /etc/passwd /etc/ftpusers \
| sort -t ":" -n -k 3 \
| awk 'BEGIN {FS=":"; OFS="\t";} \
$7 != /bin/false && $3 >= 1000 \
{print $1, $3, $4, $7;}'

awk の変数 OFS がなぜかFreeBSDで通らないのが謎。

って、ここはsed刷れだった。
sedもいじってみよう。


59 :login:Penguin:04/01/10 10:55 ID:siaa18gv
awkつまみ食い(1時間コース)
ttp://www.is.kochi-u.ac.jp/~honda/Joen/07Awk.html




/* emp.dat */
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18

/* m6.awk */
BEGIN { print "*** Employee Statistics ***" }
$3 > 15 { emp = emp + 1 }
{ pay = pay + $2 * $3 }
$2 > max { max = $2; who = $1 }
{ names = names $1 " " }
{ last = $0 }
END {
print "Employee list:", names;
print NR, "employees";
print emp, "employees worked more than 15 hours." ;
print "total pay is",pay;
print "average pay is",pay/NR;
print "Highest hourly rate:", max, "for", who ;
print "Who was the last:",last;
}

60 :login:Penguin:04/01/10 10:57 ID:siaa18gv
$ awk -f m6.awk emp.dat

*** Employee Statistics ***
Employee list: Beth Dan Kathy Mark Mary Susie
6 employees
3 employees worked more than 15 hours.
total pay is 337.5
average pay is 56.25
Highest hourly rate: 5.50 for Mary
Who was the last: Susie 4.25 18


ほかにも、 awk は 組み込み 関数や、
if-else文、 while文、 for文などを 使った 複雑な 計算や
プログラム制御を おこなう ことが できます。

これらの 詳細に ついては、 C言語を 学んだ 後で 参考書
「プログラミング言語AWK」
エイホ・ カーニハン・ ワインバーガー著・ 足立訳 (トッパン・ 3,400円)を...

61 :login:Penguin:04/01/10 14:28 ID:gicz3W8H
久しぶりに良スレだ。
まとめサイトキボソ

62 :login:Penguin:04/03/07 01:23 ID:0UiefwuC
保守上げ

63 :login:Penguin:04/03/15 22:06 ID:cMKAgcb5
!/usr/bin/perl -p
if(/(\d+)\.\d+/) {
if($1 > $sec) {
$sec=$1;
$subsec=1;
} else {
$subsec++;
}
s/\d+\.\d+/$sec.$subsec/;
}

64 :63:04/03/15 22:09 ID:cMKAgcb5
>>46
スレ違いだがawkでもいいなら、、、
57のperl版でw

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

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

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)