sed

このエントリーをはてなブックマークに追加
466名無しさん@お腹いっぱい。:2012/11/05(月) 15:53:27.99
>>464
シェルスクリプトから呼び出せば良いんじゃないの?
sedだって所詮は外部コマンドだし。
467名無しさん@お腹いっぱい。:2012/11/05(月) 21:31:52.30
>>482
sed -n -f hoge.sed <aaa

hoge.sed:

/<hoge>/b hoge
p
b end

:hoge
N
N
/<hoge>\n abc\n<\/hoge>/!p
:end
468名無しさん@お腹いっぱい。:2012/11/06(火) 04:00:03.51
>>458
aaaがXMLならXMLパーサ(を使える言語)を使った方がいいと思う
/<hoge>/!b
:loop
$b last
/<\/hoge>/!{
N
b loop
}
:last
s/<hoge>[ \n\t]*abc[ \n\t]*\(<\/hoge>\)*//g
469名無しさん@お腹いっぱい。:2012/11/20(火) 09:09:15.11
すみません。教えて下さい。
テキストの最終行のあとに空白行を1行入れる、というのはどう書くのでしょうか。
iコマンドでは最終行の前に空白行ができてしまいます。
470名無しさん@お腹いっぱい。:2012/11/20(火) 09:23:56.98
sed -e '$a\
hoge
'
471名無しさん@お腹いっぱい。:2012/11/20(火) 09:30:53.76
ありがとう。助かりました。
472名無しさん@お腹いっぱい。:2012/11/22(木) 01:22:12.85
最終行の後なら

$ cat >> tmp

$
で十分であるようにも思うけどなぁ
473名無しさん@お腹いっぱい。:2012/11/22(木) 03:29:10.92
ああ、なるほど。いつか思い出して使うこともあるでしょう。ありがとう。
474名無しさん@お腹いっぱい。:2012/11/22(木) 07:19:23.18
>>472
1行追加ならechoの方が楽でね?
475名無しさん@お腹いっぱい。:2012/11/22(木) 11:59:50.11
そうなんだけど、sedファイルの中に書き込みたかったんですよ。でも、ありがと
476名無しさん@お腹いっぱい。:2013/01/04(金) 10:51:16.73
optimized sed
http://www.commandlinefu.com/commands/view/11707/optimized-sed
巨大ファイル対象の場合は
sed '/foo/ s/foo/foobar/g' <filename>

sed 's/foo/foobar/g' <filename>
よりも効率がよいとの事ですが、どういう原理でそうなるんでしょうか
477名無しさん@お腹いっぱい。:2013/01/04(金) 12:52:49.06
"foo"の在る行だけを対象にするから?
どのみち見つけに行くんだから同じじゃん?と想ったり想わなかったり
478名無しさん@お腹いっぱい。:2013/01/04(金) 12:55:13.46
>>476
100万行のテキストファイル、GNU版のsedで試してみたけど
どっちも変わらなかったぞ
479名無しさん@お腹いっぱい。:2013/01/05(土) 01:12:15.15
つまり、都市伝説って事か
どのsedかによっても違うんだろう
480名無しさん@お腹いっぱい。:2013/01/05(土) 09:49:03.44
対象になる行の割合にもよるんじゃないの?
481478:2013/01/05(土) 10:26:37.21
1億行、954MBのファイルでやってみた

$ seq -w 100000000 > large.txt
$ sed --version | head -1
sed (GNU sed) 4.2.2
$ grep '111' large.txt | wc -l
549739

$ for i in {1..3}; do time sed 's/111/999/g' large.txt > /dev/null; done
sed 's/111/999/g' large.txt > /dev/null 28.68s user 0.77s system 80% cpu 36.731 total
sed 's/111/999/g' large.txt > /dev/null 28.75s user 0.68s system 82% cpu 35.666 total
sed 's/111/999/g' large.txt > /dev/null 27.99s user 0.61s system 81% cpu 35.067 total

$ for i in {1..3}; do time sed '/111/ s/111/999/g' large.txt > /dev/null; done
sed '/111/ s/111/999/g' large.txt > /dev/null 27.68s user 0.63s system 82% cpu 34.418 total
sed '/111/ s/111/999/g' large.txt > /dev/null 27.96s user 0.72s system 57% cpu 49.912 total
sed '/111/ s/111/999/g' large.txt > /dev/null 28.84s user 0.71s system 81% cpu 36.287 total
482名無しさん@お腹いっぱい。:2013/04/08(月) 00:25:48.59
>type diff
diff is /usr/bin/diff
> type diff | sed 's,[()],,g;s,^[^/][^/]*,,;q'
/usr/bin/diff
s,[()],,g;s,^[^/][^/]*,,;q'
ってどう解釈すれば良いんですか?
483名無しさん@お腹いっぱい。:2013/04/08(月) 05:56:57.86
人それぞれ
で良いんじゃない
484名無しさん@お腹いっぱい。:2013/05/21(火) 06:44:35.71
Macでgsedを使っています。やりたいこと
★のある行と☆のある行の間にある行のうち、ひらかなを含む行の行頭に@を付ける。
(ひらかなが1文字でも入っていれば良い)

/★/,/☆/{
/[あ-ん]/s/^/@/
}

無視されてしまうんです。助けてください。
485484:2013/05/21(火) 08:34:08.57
[あ-ん]がいけなかったみたいです。[あいうえお(中略)ん、。]でできました。
486名無しさん@お腹いっぱい。:2013/05/21(火) 13:23:01.78
あ-ん♪
487名無しさん@お腹いっぱい。:2013/05/21(火) 16:08:58.36
>>484
ぽーつ使ってるならssed入れてpcre環境にすれば\p{Hiragana}とか
できるんじゃね
488名無しさん@お腹いっぱい。:2013/05/22(水) 03:36:42.23
ごめんワカンナイ
489名無しさん@お腹いっぱい。:2013/05/22(水) 16:53:09.99
ssedって次期GNU sedのこと。
GNUのページでもこの拡張には依存するなって書いてる。
ただ、macでBSD系のsedじゃなくGNU sed使ってるんなら
port依存って意味ではあんまり変わんないんじゃない?
490名無しさん@お腹いっぱい。:2014/03/04(火) 03:45:38.92
>>334
横から&亀だが

sed '/pattern/ {
'"`sed 's/^/i\\\\\n/' <file`"'
}'
491名無しさん@お腹いっぱい。:2014/06/03(火) 18:27:21.57
gnuWin32のsed version4.2.1です
sedで、"を入れたくて下記のようにしたのですが、うまくいきません。どうしてでしょうか

sed -e "s/^/ \"/" hoge.txt > hoge2.txt

エスケープの\がうまく利かず、
sed: >を読み込めません
というわけわからんエラーメッセージが出てきます
ちなみに、

sed -e "s/^/ \\/" hoge.txt > hoge2.txt

とかならちゃんと動きます
492名無しさん@お腹いっぱい。:2014/06/28(土) 14:33:09.63
>>491
UNIX板で答えない方が良いのかもしれませんが、適当なスレが無さそうなので
windows のコマンドプロンプトで実行しているとして答えます。

cmd.exe の仕様が原因と思われる
sed -e "s/^/ "^""/" hoge.txt > hoge2.txt
493名無しさん@お腹いっぱい。:2014/06/28(土) 14:56:57.91
sedを使用する際の注意事項があります。
コンピュータのCPUが何ビットであるか調ベておく事が大切です。

32ビットCPUを搭載したコンピュータには、
32ビット用のsedをインストールすること。

64ビットCPUを搭載したコンピュータには、
64ビット用のsedをインストールすること。

これを間違えれば正常にsedが動作しません。
494名無しさん@お腹いっぱい。:2014/08/20(水) 00:07:25.20
sedの使い方がわからず、試行錯誤しているのですが、うまくいきません。
行の先頭に特定の文字列(たとえば"abc")があったらその行を丸ごと"xxxxxxxxxxx"に置換するにはどうすれば良いでしょうか。

例:
abc123456

xxxxxxxxxxx
に変換さえるイメージです。
495名無しさん@お腹いっぱい。:2014/08/20(水) 01:37:59.80
>>494
sed -n /^abc/p
sed s/^abc.*$/xxxxxxxxxxx/
496名無しさん@お腹いっぱい。:2014/08/20(水) 01:39:49.69
パイプで使うバージョンを書く
|sed 's/^abc.*/xxxxxxxxxxx/'
497名無しさん@お腹いっぱい。:2014/08/20(水) 02:29:51.22
sed '/^abc/cxxxxxxxxxxx'
498名無しさん@お腹いっぱい。:2014/08/20(水) 03:06:02.58
abc -> xxx
abc123 -> xxxxxx
abc12345 -> xxxxxxxx
をsedでやるならどう書くんだろ
499名無しさん@お腹いっぱい。:2014/08/20(水) 06:22:02.63
>>498
s/./x/g
500名無しさん@お腹いっぱい。:2014/08/20(水) 10:13:13.33
>>494
sed '/^abc/s/./x/g'
かな?
501名無しさん@お腹いっぱい。:2014/09/17(水) 02:37:37.33
パスワードのゼロ埋め(ゼロパディング)と見た。
502名無しさん@お腹いっぱい。:2014/10/21(火) 08:56:25.00
バックスラッシュって読みやすいか?日本語だと使い道無いし。

プログラミングで正規表現書いてると、
s/\dhoge\sfuga\s/hoge/
↑似たような記号ばっかりで読みづらいw

s/¥dhoge¥sfuga¥s/hoge/
↑こっちのほうが読みやすい
503名無しさん@お腹いっぱい。:2014/10/21(火) 10:00:39.43
使い道ある記号だったらエスケープシーケンスにも
円記号ねじ込むにも適さなかっただろうよ
504名無しさん@お腹いっぱい。:2014/10/21(火) 11:48:25.80
最近可愛く見えてきた。意味を持たない組み合わせに腹を立てたり。
505名無しさん@お腹いっぱい。:2014/10/21(火) 13:00:32.47
スラッシュとバックスラッシュが紛らわしいんならスラッシュ以外の
文字を区切りに使えばいいんでないの?
506名無しさん@お腹いっぱい。:2014/10/21(火) 13:05:36.87
区切りを変更できるのはsコマンドとかの時だけ
507名無しさん@お腹いっぱい。:2014/11/06(木) 07:19:05.88
1,/hoge/ のようにaddressに正規表現を使う時のスラッシュを
他の記号に変えることはできますか?
s@http://@https://@ のようなことをしたいのです
508名無しさん@お腹いっぱい。:2014/11/06(木) 08:27:36.11
>>506 にあるようにできない。
509名無しさん@お腹いっぱい。:2014/11/06(木) 08:42:54.81
できる実装もあるかもしれない
510名無しさん@お腹いっぱい。:2014/11/06(木) 09:21:40.14
コピペ改変にかまうな
511名無しさん@お腹いっぱい。:2014/12/23(火) 16:27:26.38
他人が書いたコードで、例えば文字列が、
11 AAA [BBB] CCC/DDD.txt EEE FFF-01
だった場合に、ここから[]内の文字(BBB) を抜き出すために、
sed -e 's/\[//g' -e 's/\]//g' | awk '{ print $3 }'
というスクリプトで BBB を取得しています。

このスクリプトを変更して、DDD を取得したいのですが、
どう書けば良いのでしょうか?
512名無しさん@お腹いっぱい。:2014/12/23(火) 19:23:47.26
s,.*/,,; s,\.txt.*,,
513名無しさん@お腹いっぱい。:2014/12/24(水) 15:41:51.14
ありがとう
514名無しさん@お腹いっぱい。:2014/12/28(日) 06:55:35.52
>>507
1,\@hoge@

linuxで確認済み
検索でここにたどり着いた人の為と、何処のコピペか検索してもそれらしいものが出なかったので、貼っておきます

POSIX
sed
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html
In a context address, the construction "\cBREc", where c is any character other than <backslash> or <newline>, shall be identical to "/BRE/".
If the character designated by c appears following a <backslash>, then it shall be considered to be that literal character,
which shall not terminate the BRE. For example, in the context address "\xabc\xdefx", the second x stands for itself,
so that the BRE is "abcxdef".

BSD
On-line Manual of "sed"
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=sed&dir=jpman-5.4.0%2Fman&sect=0
1. コンテキストアドレスにおいて、バックスラッシュ (``\'') と改行以外の 文字を正規表現の区切りとして用いることできます。
区切り文字の直前に バックスラッシュを置くことで、区切り文字をリテラルに解釈させることが できます。
たとえば、コンテキストアドレス \xabc\xdefx において、区切 り文字は ``x'' で、2つめの ``x'' は ``x'' という文字を表します。
よっ て、正規表現は ``abcxdef'' と解釈されます。

LINUX
Man page of SED
http://linuxjm.sourceforge.jp/html/GNU_sed/man1/sed.1.html
/regexp/
正規表現 regexp にマッチした行にマッチする。
\cregexpc
正規表現 regexp にマッチした行にマッチする。c には任意の文字を指定できる。
515名無しさん@お腹いっぱい。
おおお、グレート義太夫