sed

1名無しさん@お腹いっぱい。
垢版 |
NGNG
sedスレッド
123名無しさん@お腹いっぱい。
垢版 |
2006/08/22(火) 16:18:15
ウムムム
2006/11/03(金) 09:37:20
同じ文字が3文字連続していたら表示したいのだが
2006/11/04(土) 02:04:43
>>124
http://pc8.2ch.net/test/read.cgi/unix/1039165754/600
2006/11/14(火) 20:28:59
grep, sed, awk
http://www.shuwasystem.co.jp/books/wwwsrch/cgi-bin/content/794/index.htm
この本ってどうですか?
単なるマニュアル以上の情報は載ってる?
2006/11/14(火) 20:59:20
このシリーズはなんとなく印象が悪いので手にとってないな。そういえば。
128名無しさん@お腹いっぱい。
垢版 |
2006/11/18(土) 10:13:03
教えてください。
awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、
あるファイルに含まれる行を削除するにはどうすればよいのでしょうか?

例)
--aaa.csv--
111,222,333,444
555,666,777,888
999,000,111,222

--file1.txt--
111222
555666

の場合、aaa.csvより下記行のみほしい。
999,000,111,222

ご存知でしたら、ご教授ください。
よろしくお願いします。
2006/11/18(土) 11:48:03
>>128
sed 's/\(...\)\(...\)/^\1,\2/' file1.txt | egrep -f- -v aaa.csv
2006/11/18(土) 12:30:05
>>129
突っ込みだけでスマン。それだと、
111,222999999999,333,444
なんていうのがaaa.csvにあると、これも削除されるぞ。

数字の桁数が自由か固定かあいまいな>>128がいけないんだが、
sedの置換先は /^\1,\2,/ みたいなんの方が安全と思う。

131名無しさん@お腹いっぱい。
垢版 |
2006/11/18(土) 20:48:36
>>129-130さんありがとうございました。
大変、参考になります。
私の説明がいけなかったのですが、
aaa.csvの1カラム目と2カラム目は固定ではなく、自由です。
ですので、
--aaa.csv--
11111,2222,333,444
55,666666,777,888
のような場合もあるのです。

また、file1.txtのほうも固定ではなく、
--file1.txt--
1111111222
555666
2233333
とスペースが入っている場合すらあります。

度々で恐縮ですが、
ご存知でしたら、ご教授ください。
よろしくお願いします。

2006/11/18(土) 23:16:33
>>131
仕事で必要ならコンサルタントを雇いなさい。
2006/11/19(日) 01:09:53
perl かなんかで書いちゃった方が早いよ。
2006/11/19(日) 07:09:03
sed,awk=perlかなんか
2006/11/28(火) 22:11:41
職場のマシン、perlが入ってなかった・・・ orz
2006/11/28(火) 22:52:45
この場合は、sedよりawkなんかな?
awkで書いてスピードアップのためのawkccしてしまうとか。
137名無しさん@お腹いっぱい。
垢版 |
2006/12/07(木) 00:21:57
ご存知でしたら、教えてください。
Solarisのawkで、変数に対しての比較に正規表現が使えないのですが、
よい方法をご存知の方がいましたら、教えて下さい。
nawkなら、上手くいくのですが、awkでは無理なのでしょうか?
また、Linuxのawkなら、上手くいきました。
よろしくお願いします。

例)下記の場合、./test.shを実行すると、test.awkの正規表現を使用している部分[if ( $7 ~ HENSU )]
でエラーになってしまいます。
--------------------test.shの中身--------------------
#!/bin/sh
HENSU="3A"
cat testdt.txt | \
awk -f test.awk HENSU=${HENSU}
exit 0
-----------------------------------------------------
--------------------testdt.txtの中身--------------------
aaaaabbbbcccdddeeeeeffffffgg3Aggggghhhhhhhiiiii
-----------------------------------------------------
--------------------test.awkの中身--------------------
BEGIN{
FS="\t"
}
{
if ( $7 ~ HENSU )
{
print $0
}
}
-----------------------------------------------------
138名無しさん@お腹いっぱい。
垢版 |
2006/12/07(木) 20:54:41
>>137
awk -f test.awk -v HENSU=${HENSU}
じゃね?
確認はできんが
139名無しさん@お腹いっぱい。
垢版 |
2007/02/04(日) 08:46:50
ある文字列を
現在時間+引数
に置換したいのですが、どのようにすればいいですか?

perlを使えば簡単なんだけど、職場のマシンでperl が入ってなかった(汗)

ちなみに、sed とawk は使えるみたいです。
2007/02/06(火) 00:47:03
>>139
引数によるけど、dateコマンドが使えてたら、OKでは。
$ date +%R
00:45
$ date --date '6 min ago' +%R
00:39
という感じで引数を与えるといけると思う
141名無しさん@お腹いっぱい。
垢版 |
2007/02/11(日) 21:34:20
入力ファイルを書き換えることはできる?

% sed 's/ABC/abc/' input.txt > output.txt
よくある上のようなプログラム(と呼ぶのかな?)で、
出力をoutput.txt
じゃなくてinput.txt のファイル自身を書き換えたいんだけど、可能かな?

つまり、余計なファイルは出力させたくないんだよ。
2007/02/11(日) 21:46:12
>>141

a.in-place オプションが使えるバージョンのsedを使う
b.inplaceというコマンドをつかってみる
c. (rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat

あるいは
http://pc10.2ch.net/test/read.cgi/unix/1157601611/708-727
あたりを参照
143141
垢版 |
2007/02/11(日) 21:57:51
>>142
情報サンクス
a. の方法を用いました
2007/02/11(日) 22:27:47
問題解決したようだけどこぴぺして編集

・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する
http://www.idaemons.org/projects/inplace/  を使う
・(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat


FreeBSD の標準 sed に -i オプションが取り入れられたのは 4.7R でそれ以前には無い。
NetBSD の標準 sed には -i オプションは無い。 
OpenBSDの(ry
MacOSX の 標準 sed は FreeBSD 由来なので元になるバージョンに依存する。
MacOSX 10.3以降は FreeBSD 5.1R由来なので、 -iオプションはある。
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 ) (3.02には in place オプションは無い)

2007/02/11(日) 23:12:50
>>144
まとめ乙
2007/02/26(月) 05:04:17
あってもなくてもいい追加
HP-UX 11i Version 2: September 2004
http://docs.hp.com/ja/B2355-90851/sed.1.html
AIX 5L Version 5.2
http://inetsd01.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/sed.htm
SunOS 5.10
http://docs.sun.com/app/docs/doc/819-1210/6n3j74jsr?q=sed&a=view

いづれも 標準 sed に -i オプションは無い
2007/02/27(火) 15:18:51
irix
http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=man&fname=/usr/share/catman/u_man/cat1/sed.z&srch=sed
2007/04/16(月) 23:15:15
仕事で root してる人に質問です。
皆さんどれぐらい仕事で sed スクリプト書いてます?

スクリプトの後々のメンテナンスと、既に周囲に読める人があまり
居ないこととを考えると、s での置換以外では perl を使うか、そ
うなったらもう全部 perl にした方がいいのかなと最近思ったりし
ます。

6行の sed スクリプトを書いたのですが、コメントが 8 行になっ
てしまって。。。
2007/04/17(火) 00:51:04
sedで複数行書くのは犯罪だ。awkで書こう
2007/04/17(火) 00:55:39
そんなん読めないやつに管理まかせちゃいかんよ。
2007/04/18(水) 23:42:12
>>148
すぐに読めなくても、それがsedのスクリプトであることを書いておけば、
perlを使えるひとならちょっとの手間で読めるようになるでしょ。
そうでなければ>>150ということに。

それから、6行のスクリプトのコメントが8行になっても、それはそれでいいじゃないか。
2007/04/19(木) 01:05:48
sedの複数行は本当に頭痛がしてくる。
perでlさえ可読性悪いと言われてるのにその比じゃない。
個人的趣味以外で書いてはいけない
2007/04/21(土) 01:38:29
sed のコードのそばに、
それを perl なり awk なりで書いたものを
コメントとして残せば
・可読性→クリア
・コメント行数→クリア
・メンテ→工数倍w
2007/04/21(土) 03:10:13
s2pでいいじゃん、とかおもったりおもわなかったり
2007/05/08(火) 00:15:31
sedで千行あるファイルの
100行目から150行目を
抜き出すには
どうしたらいいですか
2007/05/08(火) 00:17:32
sed -ne "100,150p"
2007/05/08(火) 11:04:38
sed -n 100,150p
158名無しさん@お腹いっぱい。
垢版 |
2007/06/04(月) 20:43:16
単語の置換をしたいんだけど、どうしたらよいでしょうか


具体的な例で言うと、あるソース中の int を char に全置換したい
んだけど 単純に sed "s/int/char/g" だと printf まで変わって
しまうから それは避けたい。
「単語」の条件は 英数字+アンダースコア (\w+) であること。

これ絶対FAQだと思うんだけど、 「sed 単語 置換」 で検索しても
答にたどり着かなかったのですよ。 困った。
2007/06/04(月) 21:26:42
perl -pe 's/\bint\b/char/'
2007/06/04(月) 21:37:31
>>159 アフォか

正解:

sed 's/\<int\>/char/g'
161158
垢版 |
2007/06/04(月) 22:15:45
>>159
ありがとうございました!
うまくいけました。
2007/06/04(月) 22:20:07
\< \>で思い出したけど、HP-UXのgrepではこれ使えんのだよな。
同じregexpライブラリを使っているなら、sedでも使えんな。
163159
垢版 |
2007/06/04(月) 23:51:11
スレタイ読まずに書き込んで感謝されちゃったよ

こういうのを
いたたまれない気持ち
っていうのかな
2007/07/01(日) 11:49:33
1
2
3
4
というtemp.txtをsed N temp.txtとすると
1
2
3
4
になるのはわかるのですがsed n temp.txtにすると
2
3
4
にならないのはどうしてですか
夜も眠れません
2007/07/03(火) 10:30:14
sed -e N -e 's/^/X/' -e 's/$/x/'
sed -e n -e 's/^/X/' -e 's/$/x/'
166名無しさん@お腹いっぱい。
垢版 |
2007/07/03(火) 18:48:39
下記のように、置換する文字に変数って使えないんでしょうか?
設定ファイル100個飛ばしてしまったorz
forでループして、一気に変えたいんですが、$mlとそのまま置換されて
しまいます。このままだと、全部手がきです(T.T)
どなたかお助け下さい。

ml=hoge
sed 's/$ml/foo/'
2007/07/03(火) 18:51:10
>>166
それはsedじゃなくて、シェルスクリプト側の話だね。
' ' じゃなくて " " を使う。

sed "s/$ml/foo/"
2007/07/03(火) 19:17:43
そしてmlが"/"を含んでいて破滅する。
2007/07/03(火) 19:30:17

できました!(T.T)
ありがとうございました。一時は徹夜を覚悟しました。
本当に助かりました。ありがとう!
2007/07/09(月) 22:52:03
>>168
まさにそれ。
やりたいのは、特定の文字列を
現在のディレクトリ位置に置換したいということなんですが、
シェルスクリプトで
sed s/hoge/$PWD/g < file1.txt > file2.txt
と書くと、エラーになってしまいます。
($PWDが/を含んでいるから)
だれかうまいやり方わかりませんか?
2007/07/09(月) 22:54:37
sed "s|hoge|$PWD|g" < file1.txt > file2.txt
2007/07/09(月) 23:43:40
>>171
はやっ!ありがとー!
でもごめんなさい、実は明後日まで試せる環境がないので、
また試せたら報告に来ます。
173名無しさん@お腹いっぱい。
垢版 |
2007/07/12(木) 20:37:34
sedでラベルを1行スクリプトに組み込むのは無理ですか?
sed '/^$/!{N;};/^$/{s/\n //g;}
Nが終わったあとにスクリプトの最初に戻したいのですが美味くいきません・・・
174名無しさん@お腹いっぱい。
垢版 |
2007/07/12(木) 21:01:50
【参院選】民主党から、在日コリアンの期待背負った金氏(民団幹部)が立候補…在日参政権訴え
http://news22.2ch.net/test/read.cgi/newsplus/1184227903/l50
2007/07/12(木) 21:55:25
>>173
普通にできるけど。:label; hoge; b label みたいに。
176170
垢版 |
2007/07/12(木) 23:18:53
報告おくれましたが、無事できました。
本当にどうもありがとう!
2007/07/14(土) 03:55:18
>>173
-e

>>175
普通じゃない
2007/07/14(土) 09:07:49
>>177
>>173 の質問読み直せ。-e で連結する話とは違うぞ。

>>175 が正解。たぶん、>>173 はラベルの後のセミコロン忘れてできなかったんだろう。
2007/07/14(土) 09:12:01
省略せずに結果を書くと、

sed ':label;/^$/!{N;};b label;/^$/{s/\n //g;}'

↑な。これで何をやりたいかは知らんが。
2007/07/14(土) 13:40:28
>>178
ラベルの後に続けて書けるのはGNU含む一部のsedのみ。
だから普通じゃない。
普通はラベルごとに切って -e で繋ぐ。

sed -e ':label' -e '/^$/!{N;};b label' -e '/^$/{s/\n //g;}'
181名無しさん@お腹いっぱい。
垢版 |
2007/07/19(木) 11:31:07
タブ文字(0x09)だけをカンマに置換する方法はありますか?
バージョンはGNU sed の 3.02です。
2007/07/19(木) 11:46:36
普通に sed 's/\t/,/g'
2007/07/19(木) 12:11:34
>>182
3.02は\tを使えません
2007/07/19(木) 12:14:25
>>181
普通にタブ文字を入れる。
2007/07/19(木) 12:16:24
普通に sed 's/ /,/g'

タブのところは、シェル上なら Ctrl-Vに続けて入力。
シングルクォート必須。

なお、上の sed をコピペしても、TABが表示上で変換されてるので動かないと思う。
2007/07/19(木) 13:25:58
>>184
T=`echo -ne "\t"`
sed -e "s/$T/,/g"
で出来ました。
ありがとうございました。
2007/07/19(木) 13:31:46
>>186
そんなことしなくても、普通に >>185 でできるわけだが、、
何をわざわざ大変なことしてるだよww
2007/07/19(木) 13:35:52
>>185 では動きませんでした。よく知りもせず、確認もせずに回答しないでください。
2007/07/19(木) 13:41:02
>>187
あとで自分のシェルプログラムを読むときに
見えないタブコードのままだと誤解をしそうだし
Ctrl-Vという入力方式が使えない端末もあるので
あえて大層に書きました。
2007/07/20(金) 15:25:43
改行がCRLFをLFにするには、
sed -e 's/\r//' < target > out や
sed -e 's/^M//' < target > out
で出来るんだけど、逆にLFをCRLFにするにはどーしたら良いですか?

sed -e 's/\r\n/\n/'
sed -e 's/^M^J/\n/'
sed -e 's/^M\^J/\n/'
いずれもだめでした。

sedは GNU sed 4.1.5版 です。
2007/07/20(金) 16:06:36
>>190
普通に sed 's/$/\r/'
192190
垢版 |
2007/07/20(金) 18:19:11
出来ました。
193名無しさん@お腹いっぱい。
垢版 |
2007/07/21(土) 00:53:54
おお、ちょうどいい!もれも似たようなことで
CR/LFを<BR>にしたかったw

dクスでつ190-191
2007/08/08(水) 19:34:32
正規表現にマッチした文字列だけを出力したい というとき

たとえば文字列の前の方の数字だけ取り出すときは
sed -n "s/^\s*\([0-9]*\).*$/\1/p"
みたいに 正規表現にマッチした全体をマッチした部分で置換する
ようにやってたのですが、いちいち置換するのは 格好悪いので
部分\1だけ出力するような格好いい書き方ありませんか?
2007/08/09(木) 00:53:55
perl -nle 'print $1 if /\b(\d+)/'
2007/08/09(木) 03:14:20
>>194
GNU grep の -o オプションを使う。
ほかの grep だったらごめんなさいw
2007/08/09(木) 13:19:08
sedスレのつもりだったんだけど、まあいいや。ありがとん。
2007/08/16(木) 23:03:21
あるテキストファイルの1行目〜最終行の1000行前までを
取り出したいのですが、どのようにすればよいでしょうか?
(ちょうど tail -n 1000 tmp.txt で取り出せない部分を
簡単に得たいのですが)
2007/08/16(木) 23:07:04
awk '{a[NR]=$0}NR>20{print a[NR-1000]}'
2007/08/16(木) 23:08:31
まちがえた。
sedでやっても美しくならないから、awkで
awk '{a[NR]=$0}NR>1000{print a[NR-1000]}'
2007/08/17(金) 08:48:47
sed -n '1h;1!H;1001,${g;P;s/[^\n]*\n//;h}'
2007/08/17(金) 12:49:09
sedでやらなきゃいかんの?
2007/08/17(金) 13:44:34
>>202
sedスレなので
2007/08/17(金) 14:06:45
なんでsedスレを選んだんだろ。
2007/08/17(金) 15:15:15
そこにsedがあるから
2007/08/17(金) 21:24:35
>>200
>>201
レスありがとうございました。大変助かりました。
今回はawkを使おうと思いますm(__)m

>>202
すみません、sedを覚えたての初心者なもので・・・
2007/08/21(火) 03:25:33
sed -n ':b;1001,${P;N;D};N;bb'

詰め
208名無しさん@お腹いっぱい。
垢版 |
2007/09/06(木) 11:55:22
下のような行があったとして

command, --いろいろなコメント

command, だけ残して、--いろいろなコメント(--から後ろ)を全部削除
したいのですがどうすれば良いんでしょうか?
本を読んでもよくわかりません。どうかお助け下さい。
2007/09/06(木) 12:02:37
sed 's/--.*//'
210208
垢版 |
2007/09/06(木) 12:05:26
消えました!
ありがとうございました!>>209

ほんと助かりましたです。
211名無しさん@お腹いっぱい。
垢版 |
2007/09/06(木) 13:04:52
質問ばかりで恐縮なのですが、もうひとつ質問があります。

line...$

な行があったとして、^line を見つけた時に、下のようにおしりに
HOGEな文字列を追加したい場合はどうすれば良いのでしょうか?

line... HOGE$

ほんと、勉強不足で申しわけありません。オライリー本を片手にやってる
のですが、どうしてもわかりません。
2007/09/06(木) 13:12:43
>>211
sed '/^line/s/\$$/ HOGE$/'

address について調べれ。
2007/09/06(木) 13:31:20
>>211 の $ は文字じゃなくて、正規表現の $ の意味ではないのかと
2007/09/06(木) 14:15:56
>>212-213

ありがとうございました。

sed '/^line/s/$/ HOGE/'

でうまくいきました。addressについても勉強してみます!
215名無しさん@お腹いっぱい。
垢版 |
2007/10/07(日) 16:15:05
仮ファイルを使わずに
入力ファイル自身を書き換えることは出来ますか?
2007/10/07(日) 16:58:58
-i
2007/10/11(木) 01:21:12
//exec($command,$arg);
とコメントアウトされた行をアンコメントしたいんだけど
sed 's/\/\/(exec\(\$command,\$arg\);)/\\1/' -i hoge.php
とかやっても思ったとおりに置換されない

(とか$とか/とかをうまくエスケープできてないだけなのか
どうなのかがよくわかんないんだけど、どこが間違ってる?
2007/10/11(木) 01:30:55
sed -e 's@//\(exec(\$command,\$arg);\)@\1@'
219名無しさん@お腹いっぱい。
垢版 |
2007/11/11(日) 11:05:40
教えて下さい。

12345kkk6789
23456kkk4321
32456kkk9876
のようなテキストファイルが複数あり、
各行のkkk以降(kkkも含めて)を削除したいです。
1日考えてダメだったので、だれかお助け願います。


2007/11/11(日) 11:11:26
sed -e 's/kkk.*//'
221名無しさん@お腹いっぱい。
垢版 |
2007/11/11(日) 13:48:54
ありがとうございます。
222名無しさん@お腹いっぱい。
垢版 |
2007/12/19(水) 03:19:13
sed -e '500,$d' の500の部分を変数にすることって出来ますか?

例えば、sed -e '$no,$d' みたいな感じで実行するとエラーになって困ってます。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況