X

sed

1名無しさん@お腹いっぱい。
垢版 |
NGNG
sedスレッド
2008/04/16(水) 05:48:41
# >>275がいいと思うんですが。

>>281
そういうことでしたら>>262に追加で、逸材ぶりがよく伝わるスレも。
http://pc11.2ch.net/test/read.cgi/php/1204488452/42-
2008/04/16(水) 17:32:10
これは壮大な釣りなのか?
一瞬、なりすましを疑ったが、>>262,282を見ると、まさに本人だよな。
2008/05/15(木) 23:42:43
sedって文全体からある語句を置換するのは簡単だけど、
最初にマッチする語句だけ置換して後はそのまま出力しようとするとちょっと複雑になってしまうよね。
スクリプトの先頭に戻らない様なループを作らないといけない。
2008/05/16(金) 00:20:54
>>284
遠まわしに「最初にマッチする語句だけ置換をする簡易な方法はありませんか?」
って聞いてるのか?それとも独り言ならチラ裏へ。
2008/05/16(金) 11:39:13
% ( echo hogehoge; echo hogehoge ) | sed '0,/hoge/s/hoge/fuga/'
fugahoge
hogehoge

GNU sed に限るようだが。
287284
垢版 |
2008/05/16(金) 21:22:18
>>286
レスサンクスです。ただ最初の0を1でやった場合はうまくいきませんでした。

s/hoge/fuga/
:loop
p
N
s/.*\n//
b loop
漏れの頭ではこんなのしか思い付きませんでした。
もっとスマートな方法があったら教えてください。
2008/05/16(金) 21:36:55
>>287

/hoge/{
s/hoge/fuga/
:loop
n
b loop
}
2008/06/04(水) 19:06:03
/me ?
290名無しさん@お腹いっぱい。
垢版 |
2008/07/07(月) 08:34:28
n文字目のxのみyに置換というのはどうすればいいですか
2008/07/07(月) 08:36:46
n文字目のxとは、
行頭から(n-1)個の文字のあとに出現するx のことか?
行頭からn回目に出現するx のことか?

2008/07/07(月) 09:42:38
>>291
参考までに両方ともお願い
293名無しさん@お腹いっぱい。
垢版 |
2008/07/07(月) 12:09:14
前者です
2008/07/07(月) 13:30:25
>>291
後者ですが、念のため両者の場合について教えてください
2008/07/07(月) 21:50:58
行頭から4文字目のxをyに
echo xxxxxxxxxx | sed 's/^¥(...¥)x/¥1y/'

行頭から4個目のxをyに
echo x-x-x-x-x | sed 's/¥([^x]*x[^x]*x[^x]*x[^x]*¥)x/¥1y/'

とかとか?

4を変数にするのは漏れには粍
2008/07/07(月) 23:32:28
()ってのは条件になるん?
297290 293
垢版 |
2008/07/08(火) 10:30:38
ありがとうございます
確かに.×4みたいに表現できたらかっこいいですが
これで文句なしです!
2008/07/08(火) 11:11:36
>>297
×4は無理っぽい。
echo x-x-x-x-x- | sed 's/\(\([^x]*x\)\{3\}[^x]*\)x/\1y/'
2008/07/08(火) 11:49:57
>>298
Solarisのsedじゃ動かんな。
2008/08/29(金) 17:04:29
01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0

01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0

この第5フィールドの半角英数だけ(2個有る場合もあり)全角にしたいのですが
どのようにsedを作ればいいでしょうか?
2008/08/29(金) 17:07:35
>どのようにsedを作れば
釣りポイントはここですか?
2008/08/29(金) 21:15:26
その形式は、郵便屋の郵便番号データだろ。
エクセルか何かの一覧表をcsvに落としただけの代物だから
そのままでは役に立たないよ。
 そのままDBに格納し、専用プログラムで変換かけて正規化してる。
2008/10/08(水) 23:13:50
aaa.hoge
bbb.hage
ccc.foge

とかいう文字列があって、*.hoge以外にマッチする正規表現って出来るのでしょうか?
2008/10/09(木) 00:18:38
スレ違い。正規表現スレに池
2008/10/09(木) 21:57:14
>>303

その文を素直に読むと、当該文字列にだけはマッチしない
正規表現と読めるが、書き込み子の心情を忖度すると、
sed 's/[a-c]{3}\.hoge/==matched==/' って事かな?
まあ、[a-c]* でも、(aaa|bbb|ccc) でも、[[:alpha:]]* でも、
マッチする表現は無数に有るけど、(・・に、だけマッチする)
を、求めているなら、そもそも*.hoge って見当外れだし、
要するに、何が知りたいのか良く分からん。
2008/10/10(金) 17:29:18
>>305
> >>303

なるほど、ありがとうございます。
307名無しさん@お腹いっぱい。
垢版 |
2008/10/27(月) 23:08:07
ファイル内の、スペース+改行をスペースのみに置換したいのですが、
どのように記述すればよいのでしょうか。

データ数が数十万行あるため、ファイルを全部読み込んでから
置換する方法では、容量がオーバーしてしまいました。
2008/10/27(月) 23:26:18
>>307
Perl か何かで書いちゃった方が早いんじゃね?
309名無しさん@お腹いっぱい。
垢版 |
2008/10/27(月) 23:29:29
>>308
環境上、Perlを使用することができないんです。
sedでは難しいでしょうか。
2008/10/28(火) 00:02:57
環境によって違うと思うけど普通の書き方じゃダメなのか?

s/ \n/ /g
311名無しさん@お腹いっぱい。
垢版 |
2008/10/28(火) 00:07:58
>>310
自分の環境では、\nが認識されませんでした。
2008/10/28(火) 02:53:50
>>311
OSの具体的な名前とかは出さないのな。

s/\
/ /g

では?
313312
垢版 |
2008/10/28(火) 02:56:53
すまん。勘違いした。

sed はPerlと違って、入力したときに改行を取り除いてからパターンスペースに送るから、
そこで改行探しても見つかりっこない。
んで、出力時に自動的に改行は付くし、これを抑制する手段はない。

せめて awk使っとけ。Perlなくてもawkはあるだろ。
314312
垢版 |
2008/10/28(火) 02:58:41
すまん勘違いしてた。

sedはPerlと違って入力時に改行を取り除くから、置換時に改行探したって見つかりっこない。
Nとかで次の入力を読んでくれば間に挟まるけど。

2008/10/28(火) 03:19:55
おまえらマルチに親切だな
316名無しさん@お腹いっぱい。
垢版 |
2008/10/28(火) 07:09:08
ありがとうございました。
sedでは難しそうですね。別の方法を探してみます。
2008/10/28(火) 07:21:00
微妙に変えてあるとこがうまいな。
2008/10/28(火) 22:44:37
tr -d '\n'
2008/10/28(火) 22:47:24
良く読んで赤面しろw

>>318
>>307
「スペース+改行をスペースのみに置換したい」
2008/10/28(火) 22:54:10
>>307

sed '
:again
/ $/{
N
s/?n//
b again
}
'
2009/02/16(月) 16:23:57
sedの公式ホームページってないのでしょうか
awkは一応gawkがあって一応開発も続いているようですが
sedはどのような状態なのでしょうか?
いつまでたっても最短マッチを搭載しない理由もお教えねがいます。
2009/02/16(月) 23:57:10
そういう機能を追加すると、既存のスクリプトが動作しなくなるから。
ポータビリティを失ってまで実装する必要がない。(それこそ、perlでもawkでも使えばいい)
2009/02/17(火) 09:03:12
なるほど、参考になりました。
もし開発に参加できるなら参加したいと思っていたのですが
そのような理由ならそういったときはperlやawkに頼る事にします。
2009/02/18(水) 09:33:00
>>322
sedに正規表現perl互換モードを搭載すればいいだけなのにね
2009/02/19(木) 18:21:24
GNU sedの-r みたいなので、perlモードがあればいいね。
2009/02/19(木) 19:39:12
>>321
gnu sed 拡張している人たちがいるからそのあたりに乗ってみれば?
2009/02/19(木) 20:18:08
onigsedじゃダメなのか?

つーか、perl -pe でいいじゃん。
2009/02/24(火) 17:21:46
>>321
GNU sed なら
http://www.gnu.org/software/sed/
2009/02/27(金) 16:21:29
>>327
今度はsed互換ではないという
330名無しさん@お腹いっぱい。
垢版 |
2009/06/29(月) 20:49:52
質問させてください。
sedでホワイトスペースを解除または増やす方法ってあるのでしょうか?
331名無しさん@お腹いっぱい。
垢版 |
2009/06/29(月) 20:52:21
間違い。ホールドスペースです。
2009/06/29(月) 21:16:24
以下ホワイトベース禁止
2009/06/29(月) 22:40:10
白兵戦になるぞ!
334名無しさん@お腹いっぱい。
垢版 |
2009/07/03(金) 03:11:56
sedで、
/pattern/r file
ってするとマッチした行の次にfileの内容が出力されますが、
その行の前に出力する方法はないでしょうか?
ちなみにマッチする行は1個しかありません。
2009/07/03(金) 23:31:09
sed -n -e '/pattern/r file' -e p
2009/07/03(金) 23:49:16
ごめん、ダメだった。こっちで。
sed -n -e 'x;p;g' -e '/pattern/r file'

1行目の空行は無視して
2009/07/03(金) 23:53:59
1行めの空白はもう1段 | sed 1d で消せるけど……
入力の最後の1行出てなくない?
338336
垢版 |
2009/07/04(土) 00:17:53
出てなかった。

sed -n -e 'x;p;g' -e '/pattern/r file' -e '$p'

という感じで最後の行を出力することは出来るけど
patternが最後の行の場合だけ、fileの内容が次行に出ちゃう。
自分はギブアップ
2009/07/04(土) 12:34:06
いろいろありがとうございます。
sed 1個では難しいようですね。
patternより前とpattern以後に別けて、
間にfileをcatするしかないのかもしれません。
2009/07/04(土) 18:04:47
sed 2個ならなんとか
sed -e '$aEND' | sed -e '
$d
/pattern/{
r file
N
}
${
P
d
}'
2009/09/24(木) 17:28:09
>>295 の例に似てますが、
バイナリファイル(1行めの)4バイトめを ASCII 文字 0x02 -> 0x03 に
変更するにはどうすればいいでしょう?

# sed -e '1s/^\(...\)\x02/\1\x03/' in > out

ではだめでした。
試した環境は FreeBSD 7.2 です。
2009/09/24(木) 18:02:08
>>341
(dd bs=3 count=1; dd bs=1 count=1 of=/dev/null; printf '¥003'; cat) < in > out
2009/09/25(金) 10:26:24
>>341
sed -e "1s/^\(...\)^B/\1$(printf '\03')/"
でできんかね。^BはC-v C-b入力できるはず。
2009/09/25(金) 10:46:05
>>343
最初の3バイトに改行文字がない保証がないから一般的にはだめそうだな。
やっぱ行指向のsedでバイナリファイルを操作するのは無理があると思う。
345341
垢版 |
2009/09/25(金) 12:31:36
\x02 などは GNU sed の拡張仕様でした。

 # pkg_add -r gsed
 # rehash
 # gsed -e '1s/^\(...\)\x02/\1\x03/' in > out

でできました。
2009/09/25(金) 12:37:49
>>342-344 ありがとうございます。
>>342 の dd を使った方法は大変参考になります。

あと、
 # sed -e '1s/^\(...\)^V^B/\1^V^C/' in > out
でもできました。
^V^B は <Ctrl>V<Ctrl>B 、
^V^C は <Ctrl>V<Ctrl>C です。
2010/02/20(土) 21:42:41
ひとつ、お聞きいたします。

Nコマンドって、最後の行で次行が読めない場合、何もせず終了、
のはずですよね。すると、
sed 'sed ':l;N;bl' <file>
とすると何も出力されないんじゃないかと思うんですが、
私の使っているGNU sed 4.1.5版だと<file>の全部を出力してしまいます。
つまり、「何もせず終了」じゃなくて、「デフォルト出力して終了」
になっているように思われるわけですが、これは、どうなんでしょうか。
2010/02/20(土) 23:16:51
>>347
infoに書いてありました。
349名無しさん@お腹いっぱい。
垢版 |
2010/07/01(木) 23:39:24
なるほど
2010/08/17(火) 13:08:10
yコマンドで"/"を対象に入れたいんですが出来ないんでしょうか
初歩的ですいません
2010/08/17(火) 13:23:28
>>350
sed y,abc,ABC,

とかできるから、

sed 'y,ab/,ab%,'

もできる。
352350
垢版 |
2010/08/17(火) 23:26:44
そうか、区切り文字変えられるのsコマンドばかりじゃないんですね。
どうもありがとうございました。
353初心者
垢版 |
2010/10/23(土) 20:01:51
sedでシェルすくりぷとの行つなぎバックスラッシューを消して、繋ぐことできますか?
perlなら-pe "s/\\\n//g"でできます。
edでも、awkでもできれば、教えていただけませんか?
354名無しさん@お腹いっぱい。
垢版 |
2010/10/24(日) 13:40:00
できる
355初心者
垢版 |
2010/10/24(日) 21:13:33
できました ありがとう
356初心者
垢版 |
2010/10/25(月) 22:07:05
できないようですね、残念です。
2010/10/26(火) 19:38:19
sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/\n//' -e 'b lbl'

置換パターンに\nを許さない場合は
sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/
//' -e 'b lbl'
2010/10/28(木) 08:37:34
踊っているように見えて仕方がない
echo "000000$NUM" | sed -e 's/.*\(..\)\(..\)\(..\)/\1\2\3/'
2010/11/28(日) 18:33:17
sedでファイルのある部分までをファイル1、それ以降をファイル2に出力ってスマートにできませんか?
例えば100行のsample.txtというファイルで、

sed -e "50q" < sample.txt > sample1.txt
sed -e "1,50d" < sample.txt > sample2.txt

の様にするのは無駄におもえてしまいます。
360名無しさん@お腹いっぱい。
垢版 |
2010/11/28(日) 18:39:52
sed -ne '1,50w sample1.txt' -e '51,$w sample2.txt' < sample.txt
とか?
2010/11/28(日) 18:48:58
split -50 sample.txt; mv xaa sample1.txt; mv xab sample2.txt
2010/11/28(日) 19:52:27
>>360,361
ありがとうございました。勉強になります。
363名無しさん@お腹いっぱい。
垢版 |
2010/12/22(水) 23:54:50
入力テキストを

1行目の内容 2行目の内容
2行目の内容 3行目の内容
:
最終-2行目の内容 最終-1行の内容
最終-1行目の内容 最終行の内容

という形(隣り合った行の値を空白で連結する)に変換するにはどう書けば
よいでしょうか。
sed -ne '1!p;$!p'
と通せば先頭末尾以外の行を2回出力できたので、
これを2行分ずつくっつければ出来そうなのですが…
364名無しさん@お腹いっぱい。
垢版 |
2010/12/23(木) 00:03:02
¥n ってどのsedでも使えるんだっけ?

$ seq 1 10 | sed -ne '1!p;$!p' | sed 'N;s/¥n/ /'
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
2010/12/23(木) 00:47:03
seq 1 10 | sed -ne '1h;1!{H;x;s/\n/ /;p}'
2010/12/26(日) 21:44:54
s/seq/jot/
367名無しさん@お腹いっぱい。
垢版 |
2011/01/15(土) 11:45:22
unixの基礎概念という本の中に
a 21
is 10
this 3
というtest.txtファイルに対して、
sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
とすると結果は
21 a
10 is
3 this
になると書いてありましたが、実行してみると並びはかわりませんでした。
2011/01/15(土) 11:49:07
>>367
確かに。それじゃぁ一番左側の .* が、最長一致で行全体に一致しちゃうから、
並びが変わらなくて正解。

悪書の書名晒して。
2011/01/15(土) 11:50:52
久野さんらしくないミスだな。

確かに変わらないね。
2011/01/15(土) 11:51:32
>>367
真中の * の直前のスペース、
スペース2つじゃないの?

コピペするとスペースが1つとかになるので注意。
2011/01/15(土) 11:54:36
これかな? http://www.amazon.co.jp/dp/4756144772
久野先生の本だけど、そんなのが混ざってるのか。
2011/01/15(土) 12:01:42
>>371
はいそれです。解説にも
「これはどう読むかというと、『入力行を任意の文字列1と、空白のならび2と、また別の任意の文字列3
にマッチさせ、それ全体を3、2、1の順でつなげたものに置き換える』という意味になる。」と書いてあります。
2011/01/15(土) 12:06:04
>>372
なら、>>370の指摘通りで、キミが間違っている。
× sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
○ sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
2011/01/15(土) 12:10:21
2chに不慣れな感じ
2011/01/15(土) 12:11:56
專ブラなら安価ポップアップでちゃんと表示されるのかな

>>373
2011/01/15(土) 12:14:12
>>372
紙面上に、└┘└┘みたいな感じでスペースの個数は明示してあるの?
明示してないなら紙面が悪いと思うが。
2011/01/15(土) 12:36:36
>>373
空白2個ならいけるのですか。

>>376
そういう、└┘└┘みたいな感じはなかったです。文字数的にも一文字分の感じ
ですし。編集上のミスかもしれませんけど。
2011/01/15(土) 14:25:37
>>376
> 「これはどう読むかというと、『...、空白のならび2と、...
って書いてあるんだろ?
2011/01/15(土) 14:29:14
>>378
それは、¥2 のこと。「スペース2個」のことじゃないよ。
2011/01/15(土) 14:31:27
>>378 空白のならび
2011/01/15(土) 14:34:38
>>378
正規表現を理解してないバカ発見。

任意の文字列 → \1
空白の並び → \2
別の任意の文字列 → \3

と言ってるだけのこと。それとスペース2つ書くのとは意味が違う。
レスを投稿する

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

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