sed
cat aaa | sed -e ':loop; N; N; !b loop; s/^<hoge>\n abc\n<\/hoge>//' これで良いのかな? >>459-461 ありがとうございます しかし削除できませんでした ちなみにsedじゃなくて何でやったほうがいいでしょうか? >>463 はい。ありがとうございます。できればシェルスクリプトで書きたいので PerlでもRubyでも何でもいいとは思いますがそれ以外でいいコマンドはありませんでしょうか? grep -n abc して、出てきた数字でsedスクリプト作っちゃうとか。 >>464 シェルスクリプトから呼び出せば良いんじゃないの? sedだって所詮は外部コマンドだし。 >>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 >>458 aaaがXMLならXMLパーサ(を使える言語)を使った方がいいと思う /<hoge>/!b :loop $b last /<\/hoge>/!{ N b loop } :last s/<hoge>[ \n\t]*abc[ \n\t]*\(<\/hoge>\)*//g すみません。教えて下さい。 テキストの最終行のあとに空白行を1行入れる、というのはどう書くのでしょうか。 iコマンドでは最終行の前に空白行ができてしまいます。 最終行の後なら $ cat >> tmp $ で十分であるようにも思うけどなぁ ああ、なるほど。いつか思い出して使うこともあるでしょう。ありがとう。 そうなんだけど、sedファイルの中に書き込みたかったんですよ。でも、ありがと optimized sed http://www.commandlinefu.com/commands/view/11707/optimized-sed 巨大ファイル対象の場合は sed '/foo/ s/foo/foobar/g' <filename> が sed 's/foo/foobar/g' <filename> よりも効率がよいとの事ですが、どういう原理でそうなるんでしょうか "foo"の在る行だけを対象にするから? どのみち見つけに行くんだから同じじゃん?と想ったり想わなかったり >>476 100万行のテキストファイル、GNU版のsedで試してみたけど どっちも変わらなかったぞ つまり、都市伝説って事か どのsedかによっても違うんだろう 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 >type diff diff is /usr/bin/diff > type diff | sed 's,[()],,g;s,^[^/][^/]*,,;q' /usr/bin/diff s,[()],,g;s,^[^/][^/]*,,;q' ってどう解釈すれば良いんですか? Macでgsedを使っています。やりたいこと ★のある行と☆のある行の間にある行のうち、ひらかなを含む行の行頭に@を付ける。 (ひらかなが1文字でも入っていれば良い) /★/,/☆/{ /[あ-ん]/s/^/@/ } 無視されてしまうんです。助けてください。 [あ-ん]がいけなかったみたいです。[あいうえお(中略)ん、。]でできました。 >>484 ぽーつ使ってるならssed入れてpcre環境にすれば\p{Hiragana}とか できるんじゃね ssedって次期GNU sedのこと。 GNUのページでもこの拡張には依存するなって書いてる。 ただ、macでBSD系のsedじゃなくGNU sed使ってるんなら port依存って意味ではあんまり変わんないんじゃない? >>334 横から&亀だが sed '/pattern/ { '"`sed 's/^/i\\\\\n/' <file`"' }' gnuWin32のsed version4.2.1です sedで、"を入れたくて下記のようにしたのですが、うまくいきません。どうしてでしょうか sed -e "s/^/ \"/" hoge.txt > hoge2.txt エスケープの\がうまく利かず、 sed: >を読み込めません というわけわからんエラーメッセージが出てきます ちなみに、 sed -e "s/^/ \\/" hoge.txt > hoge2.txt とかならちゃんと動きます >>491 UNIX板で答えない方が良いのかもしれませんが、適当なスレが無さそうなので windows のコマンドプロンプトで実行しているとして答えます。 cmd.exe の仕様が原因と思われる sed -e "s/^/ "^""/" hoge.txt > hoge2.txt sedを使用する際の注意事項があります。 コンピュータのCPUが何ビットであるか調ベておく事が大切です。 32ビットCPUを搭載したコンピュータには、 32ビット用のsedをインストールすること。 64ビットCPUを搭載したコンピュータには、 64ビット用のsedをインストールすること。 これを間違えれば正常にsedが動作しません。 sedの使い方がわからず、試行錯誤しているのですが、うまくいきません。 行の先頭に特定の文字列(たとえば"abc")があったらその行を丸ごと"xxxxxxxxxxx"に置換するにはどうすれば良いでしょうか。 例: abc123456 が xxxxxxxxxxx に変換さえるイメージです。 >>494 sed -n /^abc/p sed s/^abc.*$/xxxxxxxxxxx/ パイプで使うバージョンを書く |sed 's/^abc.*/xxxxxxxxxxx/' abc -> xxx abc123 -> xxxxxx abc12345 -> xxxxxxxx をsedでやるならどう書くんだろ >>494 sed '/^abc/s/./x/g' かな? バックスラッシュって読みやすいか?日本語だと使い道無いし。 プログラミングで正規表現書いてると、 s/\dhoge\sfuga\s/hoge/ ↑似たような記号ばっかりで読みづらいw s/¥dhoge¥sfuga¥s/hoge/ ↑こっちのほうが読みやすい 使い道ある記号だったらエスケープシーケンスにも 円記号ねじ込むにも適さなかっただろうよ 最近可愛く見えてきた。意味を持たない組み合わせに腹を立てたり。 スラッシュとバックスラッシュが紛らわしいんならスラッシュ以外の 文字を区切りに使えばいいんでないの? 1,/hoge/ のようにaddressに正規表現を使う時のスラッシュを 他の記号に変えることはできますか? s@http://@https ://@ のようなことをしたいのです 他人が書いたコードで、例えば文字列が、 11 AAA [BBB] CCC/DDD.txt EEE FFF-01 だった場合に、ここから[]内の文字(BBB) を抜き出すために、 sed -e 's/\[//g' -e 's/\]//g' | awk '{ print $3 }' というスクリプトで BBB を取得しています。 このスクリプトを変更して、DDD を取得したいのですが、 どう書けば良いのでしょうか? >>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§=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 には任意の文字を指定できる。 どうにも理解が出来ず教えて欲しいのですが http://sed.sourceforge.net/sed1line.txt から # print paragraph if it contains AAA (blank lines separate paragraphs) sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' これがどうにもわかりません。 H;$!d;の$!dが何故必要なのか? 動作の流れを教えて頂けないでしょうか? dがあるのは段落の区切りまで何も出力させないため ファイル末尾も段落の区切りだから$!が要る ファイル末尾に必ず空行があるなら$!は要らない dでそのサイクルが終了することは知ってますね? >>519 有り難うございます。助かりました。 !dをpの様に認識してしまっていて次のサイクルに移行させる イメージがなく、$!dを最終行を表示させるとしか思ってなくて 色々試してもどうにも腑に落ちないもので質問させて頂きました。 sedで桁そろえってどうしたらいいですかる 具体的にはls -l で出てきた結果のうち、ファイル名を最初に左揃え、ファイルサイズを右揃えで出力したいのですが、 sedコマンドだけで可能ですか? どうしてもsedだけでやたいんです! お願いします! UNIX哲学に戻るんだ。 1つのことをうまくやる、ものを組み合わせればいいんだから、まずはawkでやってみる。 awkでもいいが、シェル内部コマンドだけでもできるぞ。 ls -l | while read m l u g s t1 t2 t3 f do printf ありゃ? 記号があると書き込みが切れる。記号を全角にした。半角に直して読んでね。 ls -l | while read m l u g s t1 t2 t3 f do printf ”%-20s %8d %s\n” ”$f” ”$s” done FreeBSD$ stat -f %-20N%8z * Linux$ stat -c %-20n%8s * sedでの右揃えは、一旦中身のみを切り出してから左側に余分なスペースを加えてから 右から文字数固定で切り取る。 左揃えはその逆。 >>144 の更新 NetBSDとOpenBSDの標準sedで-iが導入。 入力ファイルを書き換えるには? ・-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 オプションが取り入れられたのは 7.0 でそれ以前には無い。 OpenBSDのの標準 sed に -i オプションが取り入れられたのは 5.8 でそれ以前には無い。 MacOSX の 標準 sed は FreeBSD 由来なので元になるバージョンに依存する。 MacOSX 10.3以降は FreeBSD 5.1R由来なので、 -iオプションはある。 以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 ) (3.02には in place オプションは無い) データハンドリングとしては、 入力ファイルをコピーして更新をかける 更新処理が終わったら、入力ファイルを削除して更新ファイルをりネームして入力ファイルとする みたいな方法で必要十分。 なんでもかんでもツールで処理するのではなく、OSが得意な機能はOSのものを使う。 クラッシュがいつ起こってもデータが確保できるのは、そういう、むしろドンくさい方法。 お遊びならいざしらず、仕事では安全確実性が少しでも高い方を選ぶのがプロ。 無論、履歴から復元なんてのも、データによっては必要だが、 処理が複雑になれば、一般的にトラブルも増える。 どこまで何をやるかは、ひとえにそのデータの重要性にかかっている。 バックアップから戻してもたいした事がないなら、何やってもいいだろう。 >>274 どうだろうね。数式の入った文章を写植 は、昔の印刷物のほうが上でしょ。 印刷屋に頼んでもtexの設定をそのまま つかわずindesignに読み込むから、 ひどいものだ 昔も今もTeXでやってくれる印刷屋に頼めばいいじゃん。 今も昔も餅屋のふりした餅屋はたくさんあるからな〜。餅の見る目のない会社だったってことで。 誰でも簡単にパソコン1台で稼げる方法など 参考までに、 ⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。 グーグル検索⇒『宮本のゴウリエセレレ』 8DL33JQ0HX https://mevius.5ch.net/test/read.cgi/unix/1489979246/l50 ここから来ました。 sedでiフラグとdフラグを両方立てることってできないのでしょうか。 $ cat file aaa AAA $ cat file | sed -e '/aaa/id' AAA d aaa 頑張って /[Aa]\{3\}/d と書く 今時の正規表現修飾子とか使えるsedがあるなら俺も知りたい >>539 ありがとうございます。とりあえずその路線で行きます。 素人目にはiフラグとdフラグを同時に使えないというのは極めて不自然というか 非対称な気もしますが…… 二つの役割は直交関係にあって,別に依存・背反はないと思うんですよねぇ。 GNU sedなら I 大文字が使えるじゃあないか $ printf '%s\n%s\n%s\n' 'AAA' 'Bbb' 'aaa' | gsed -e '/a/Id' Bbb おおおおおお!ありがとうございます。Iフラグは知りませんでした! しかしこれ GNU の独自拡張なんですよねぇ……欲を言えばPOSIX標準に従いたかったんです…… すいません。とりあえず>>539 の一文字づつ手動で置き換えるというやりかたで通します。 そして今気付いたんですが iという文字はフラグだけでなくて「行挿入」というコマンドとしての 解釈もあるんですね。だから「id」でdが当該箇所に挿入された形になったんですね。 馬鹿だなぁ俺 >>543 あーその通りですわ。 逆になぜ id で大文字小文字を無視して削除ができると思ったのか疑問なくらい阿呆でした……。 精進し直します。 # 素人考えで言うと「大文字小文字を無視して検索→その行でコマンド実行」なんて頻繁に実行するだろうに それに対応した機能が (POSIXの範囲で) 存在しないってのはちょっと頂けないですねぇ…… # 尤も上級者の方々は他の,もっと優美な方法を採ってらっしゃるのかも知れませんが。 ある文字がある回数続く*行*を置換することってできないんでしょうか。 ... xbcea aaa aaa aaa dkjef ... ↑このようなファイルで、 cat ./file | sed -e 's/aaa\naaa\naaa/bbb/g' とやることで ... xbcea bbb dkjef ... このような出力が得られることを望んでいるのですが、上記のコマンドでは無理でした。> < ご教授願いますm(_ _)m printf "xbcea\naaa\naaa\naaa\ndkjef\n" | sed '/aaa/{H;d;};/aaa/!{x;/^$/d;s/aaa\naaa\naaa/bbb/p;x;}' 汚いw ☆ 日本の、改憲をしましょう。現在、衆議員と参議院の両院で、 改憲議員が3分の2を超えております。『憲法改正国民投票法』、 でググってみてください。国会の発議はすでに可能です。 平和は勝ち取るものです。お願い致します。☆☆ 知り合いから教えてもらったパソコン一台でお金持ちになれるやり方 時間がある方はみてもいいかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 9M87D sedはストリームエディタ grepは文字列検索 awkはスクリプト言語 | sed -n -e "/<station /h;/<prog /{N;G;s/\n//gp}" ^ この行の後ろに<pfm>から始まる行をくっつけたいんですが、 すごく難しくてどうやっても出来ないです どうやればいいんでしょうか? イマイチやりたいことがわからず それに頭の | と尻の ^ はなんざんす それが行ってことざんすか >>552 nkf.exeを併用しているバッチ内のコードをコピペしただけなので、|と^は関係ないです >>551 ではxmlファイル内の「<station〜>タグで始まる行」と 「<prog〜>タグで始まる行+その次の行」を1行の文字列に連結しているので、 さらにその後ろに<pfm>タグで始まる行を連結して1行にしたい、ということです (この後に正規表現で最終的にcsv形式に置換しますが割愛) | sed -n -e "/<station /h;/<prog /{N;G;s/\n//gp}" ^ <pfm> くっついた! 10年以上前にファイル内容を逆順に表示するスクリプトコピペしたけど '1!G;h;$!d' 未だに内容理解できてないぜ! 便利なの持ってんじゃん tacでいいような気もするけど 短くても難読すごいから可能ならtacのたぐい、基存のコマンドで処理したい GNU sedじゃなくて、BSDsedをビルドしたい。 OS付属の/usr/binソースはあるけど https://github.com/freebsd/freebsd/tree/master/usr.bin/sed sed単体がない。 ビルド出来るBSDsedのURLを教えてください そこの使えばいいんじゃないの Makefileは適当に改変するとして >>561 make -f MakefileしだんたけどカレントディレクトリのMakefileはそのままでは使えなかった。 オプションが必要なのかも知れないが、よくわからず。 >>562 FreeBSD のソース用の Makefile は BSD make 用で GNU make では使えないよ。 なんの OS を使ってるのかわからいけど、 pkgsrc が対応している OS なら pkgsrc 導入して、 textproc/nbsed をインストールするのが一番楽だと思う。 http://pkgsrc.org/ >>563 MacOSです。ソース側で単体ビルドできる用意されていれば出来ると考えました。 早速挑戦して上手く行ったらここに報告します。 >>563 >FreeBSD のソース用の Makefile は BSD make 用で GNU make では使えないよ。 これ当たってた。BSDの本家に問い合わせたら560のURLにあるsedのmakefileはOS用らしい。 自分で一からconfigureやmakefileを用意すればビルド出来るのかもね。 sedの最新版を使いたかったが時間あるときに563を試します。 Makefileの中見てgcc一発でも行けんだろって気がするが って自分は前それやってみた気もするが それくらい試せよ >>566 確か、Linux のcore utilとかだとconfigure sedみたいなかんじで、コマンドの単独コンパイルできる。 manにかかれているメアドでBSDの本家に問い合わせたら 単独コンパイル出来ないとの返事だった。OSビルド用らしい もう消してしまったが、成功した人がいたら教えてほしい。方法がわかれば再試行する気はあります 正規表現一致した行と,その一致した行と4行後のみを抽出とかってどうすればいいですか? -n '/re/{p;n;n;n;n;p;}' とか? *.cと*.hを落として gcc -I . compile.c main.c misc.c process.c -o sed するとmain.cの__unreachable();がリンクエラーになるけど https://github.com/freebsd/freebsd/blob/master/sys/sys/cdefs.h#L385 を参考に((void)0);に置き換えればビルドできるじゃん >>572 有難う。諦めていたけど早速やってみます。 560です。572のとおりビルドできました。 インストール済のMac版sedは2004年頃なのでバージョンアップできて助かります。 これから100近くあるソースを調べます。 linux版との互換性ない記述を書いてしまいました。 gnu sedもMac上ではビルドできていませんが諦め。 マジかよ gnu sedなんてそれこそ./configureしてmakeだけじゃん --program-prefix=gくらいつけといた方がいいだろけどさ >>575 560です。エラー、コピペしていいですか?長いんですけど。。。 gnu sed もインストール出来ました。 bash_profileのパスを最小限にしたらエラーがなくなったみたい? >>577 質問は取り消します。有難うございました。 sed -n '10509757p' primes 2147483563 2147483579 2147483587 2147483629 2147483647-2147483648-2147483647-2147483646-2147483645-2147483644 OFやらかした最終行 ... -1800706952-1800706951-1800706950-1800706949-1800706948-1800706947-1800706946-1800706945-1800706944-1800706943 sed -ie '10509758,$d' primes sedのホールドスペースは、その内容を削除するにはどうすれば? とりあえずs/.//g;xでできたけど、もっと直接的なやりかたはないんかなー、と。 sedスクリプトファイルでよく使われる拡張子はあります? ほとんどコマンドラインに-eで書ききるものでしょうが、あえてファイルにするとしたらやっぱりsed? >>582 別にこだわる必要はないけど 各種sed処理系付属のexamplesとか覗くとみんな.sedなので、あえて正書法にこだわるならやはり.sedかと 実装を隠したコマンドとして纏めたい、常に特定のオプション(-i等)で起動したい、主コードとsedの拡張チェック等を分離したいならenvを使うとよい sedによってはオプションを重ねられたり重ねられなかったりするので #! /usr/bin/env -S sed -f (-i -n -e 'check') ところでgnu sedの付録のdc.sedってのやばいなこれ 興味深いけど誰か注釈付けてくれたりしてないのか onigsed がダウンロードできなくて困ってます。 それらが引退した人も逮捕されてるの見つかって捕まって誰かに相手されないもんね ヒスンは凄く特殊な銃を使って 4232 じり下げはやめて良い部屋は空いてるんだったら 胃がびっくりしておかしくなる 家庭崩壊する それが政治とどう関係あるのが信じられなくなったから焦った read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる