sed
良く読んで赤面しろw >>318 >>307 「スペース+改行をスペースのみに置換したい」 >>307 sed ' :again / $/{ N s/?n// b again } ' sedの公式ホームページってないのでしょうか awkは一応gawkがあって一応開発も続いているようですが sedはどのような状態なのでしょうか? いつまでたっても最短マッチを搭載しない理由もお教えねがいます。 そういう機能を追加すると、既存のスクリプトが動作しなくなるから。 ポータビリティを失ってまで実装する必要がない。(それこそ、perlでもawkでも使えばいい) なるほど、参考になりました。 もし開発に参加できるなら参加したいと思っていたのですが そのような理由ならそういったときはperlやawkに頼る事にします。 >>322 sedに正規表現perl互換モードを搭載すればいいだけなのにね GNU sedの-r みたいなので、perlモードがあればいいね。 >>321 gnu sed 拡張している人たちがいるからそのあたりに乗ってみれば? onigsedじゃダメなのか? つーか、perl -pe でいいじゃん。 質問させてください。 sedでホワイトスペースを解除または増やす方法ってあるのでしょうか? sedで、 /pattern/r file ってするとマッチした行の次にfileの内容が出力されますが、 その行の前に出力する方法はないでしょうか? ちなみにマッチする行は1個しかありません。 sed -n -e '/pattern/r file' -e p ごめん、ダメだった。こっちで。 sed -n -e 'x;p;g' -e '/pattern/r file' 1行目の空行は無視して 1行めの空白はもう1段 | sed 1d で消せるけど…… 入力の最後の1行出てなくない? 出てなかった。 sed -n -e 'x;p;g' -e '/pattern/r file' -e '$p' という感じで最後の行を出力することは出来るけど patternが最後の行の場合だけ、fileの内容が次行に出ちゃう。 自分はギブアップ いろいろありがとうございます。 sed 1個では難しいようですね。 patternより前とpattern以後に別けて、 間にfileをcatするしかないのかもしれません。 sed 2個ならなんとか sed -e '$aEND' | sed -e ' $d /pattern/{ r file N } ${ P d }' >>295 の例に似てますが、 バイナリファイル(1行めの)4バイトめを ASCII 文字 0x02 -> 0x03 に 変更するにはどうすればいいでしょう? # sed -e '1s/^\(...\)\x02/\1\x03/' in > out ではだめでした。 試した環境は FreeBSD 7.2 です。 >>341 (dd bs=3 count=1; dd bs=1 count=1 of=/dev/null; printf '¥003'; cat) < in > out >>341 sed -e "1s/^\(...\)^B/\1$(printf '\03')/" でできんかね。^BはC-v C-b入力できるはず。 >>343 最初の3バイトに改行文字がない保証がないから一般的にはだめそうだな。 やっぱ行指向のsedでバイナリファイルを操作するのは無理があると思う。 \x02 などは GNU sed の拡張仕様でした。 # pkg_add -r gsed # rehash # gsed -e '1s/^\(...\)\x02/\1\x03/' in > out でできました。 >>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 です。 ひとつ、お聞きいたします。 Nコマンドって、最後の行で次行が読めない場合、何もせず終了、 のはずですよね。すると、 sed 'sed ':l;N;bl' <file> とすると何も出力されないんじゃないかと思うんですが、 私の使っているGNU sed 4.1.5版だと<file>の全部を出力してしまいます。 つまり、「何もせず終了」じゃなくて、「デフォルト出力して終了」 になっているように思われるわけですが、これは、どうなんでしょうか。 yコマンドで"/"を対象に入れたいんですが出来ないんでしょうか 初歩的ですいません >>350 sed y,abc,ABC, とかできるから、 sed 'y,ab/,ab%,' もできる。 そうか、区切り文字変えられるのsコマンドばかりじゃないんですね。 どうもありがとうございました。 sedでシェルすくりぷとの行つなぎバックスラッシューを消して、繋ぐことできますか? perlなら-pe "s/\\\n//g"でできます。 edでも、awkでもできれば、教えていただけませんか? 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' 踊っているように見えて仕方がない echo "000000$NUM" | sed -e 's/.*\(..\)\(..\)\(..\)/\1\2\3/' sedでファイルのある部分までをファイル1、それ以降をファイル2に出力ってスマートにできませんか? 例えば100行のsample.txtというファイルで、 sed -e "50q" < sample.txt > sample1.txt sed -e "1,50d" < sample.txt > sample2.txt の様にするのは無駄におもえてしまいます。 sed -ne '1,50w sample1.txt' -e '51,$w sample2.txt' < sample.txt とか? split -50 sample.txt; mv xaa sample1.txt; mv xab sample2.txt >>360 ,361 ありがとうございました。勉強になります。 入力テキストを 1行目の内容 2行目の内容 2行目の内容 3行目の内容 : 最終-2行目の内容 最終-1行の内容 最終-1行目の内容 最終行の内容 という形(隣り合った行の値を空白で連結する)に変換するにはどう書けば よいでしょうか。 sed -ne '1!p;$!p' と通せば先頭末尾以外の行を2回出力できたので、 これを2行分ずつくっつければ出来そうなのですが… ¥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 seq 1 10 | sed -ne '1h;1!{H;x;s/\n/ /;p}' unixの基礎概念という本の中に a 21 is 10 this 3 というtest.txtファイルに対して、 sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt とすると結果は 21 a 10 is 3 this になると書いてありましたが、実行してみると並びはかわりませんでした。 >>367 確かに。それじゃぁ一番左側の .* が、最長一致で行全体に一致しちゃうから、 並びが変わらなくて正解。 悪書の書名晒して。 久野さんらしくないミスだな。 確かに変わらないね。 >>367 真中の * の直前のスペース、 スペース2つじゃないの? コピペするとスペースが1つとかになるので注意。 >>371 はいそれです。解説にも 「これはどう読むかというと、『入力行を任意の文字列1と、空白のならび2と、また別の任意の文字列3 にマッチさせ、それ全体を3、2、1の順でつなげたものに置き換える』という意味になる。」と書いてあります。 >>372 なら、>>370 の指摘通りで、キミが間違っている。 × sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt ○ sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt 專ブラなら安価ポップアップでちゃんと表示されるのかな >>373 >>372 紙面上に、└┘└┘みたいな感じでスペースの個数は明示してあるの? 明示してないなら紙面が悪いと思うが。 >>373 空白2個ならいけるのですか。 >>376 そういう、└┘└┘みたいな感じはなかったです。文字数的にも一文字分の感じ ですし。編集上のミスかもしれませんけど。 >>376 > 「これはどう読むかというと、『...、空白のならび2と、... って書いてあるんだろ? >>378 それは、¥2 のこと。「スペース2個」のことじゃないよ。 >>378 正規表現を理解してないバカ発見。 任意の文字列 → \1 空白の並び → \2 別の任意の文字列 → \3 と言ってるだけのこと。それとスペース2つ書くのとは意味が違う。 任意の文字列の前か後ろの少なくともどちらかは、任意でない特定の文字・文字列(含^$)でないと困ったことになるということですね? 俺も前それで失敗した。 sedの話題はこっちへ くれぐれもシェルスクリプトスレに書き込まないように! >>377 \2,\3がφで全体がマッチ \1に行全体 一つ目が\([^ ]*\)ならよかった。 AAA BBB=111 CCC=111 この行の111を000に置き換えするのに sed -e 's/BBB=111/BBB=000/' とする以外にもっとスマートな書式を教えてください。 GNU sedです >>386 > sed -e 's/BBB=111/BBB=000/' これじゃ、お題 > この行の111を000に置き換えするのに を満たさない。 矛盾を含む質問に答えることは不可能。 >この行の111を000に置き換えするのに この行のBBB=111だけをBBB=000にする書式でした すいません。 スマートの基準がわからないけど、BBBが二度出現するのが嫌なら sed -e 's/\(BBB\)=111/\1=000/' AAA BBB=111 CCC=111 DDD=111 EEE=1111 sed -e /BBB=/{'s/111/000/'} シェルスクリプトスレで覚えたやり方 sed -e 's/<space><space>*/<space>/g' test.txt って動かないんですが? EUCだとうまく動作しないのだが、これはデフォルトなのかな そもそも、EUCはそういうツールで不都合がないようにということで作られたわけで。 日本語独特の文節や漢字などに対応しない、というのはあるけど。 <space> ってそのまま打ってるってオチだろw 急に Windows 7 64 bit で ssed が使えなくなっま。 tab8のテキストをインデントを崩さずに半角スペースに置き換えるにはどうすればいいですか? エスパーすると質問者は手段はsedじゃなくても良いと考えてる >>410 それなら「expand -8相当の処理をsedでやるには?」って聞くでしょ。 >>414 expand を知らなかった、という可能性は。 >>415 というかexpandを知らなかったからこそ 「tab8のテキストをインデントを崩さずに…」みたいな まわりくどい言い方で聞いたんでしょ。 だからsedに関係なくexpandを回答すれば回答として十分。 >>416 expandを知らないけどsedを使わなければならない理由があるんだよ! すっごく登場しにくくなったけど>>415 さんが正解です。 >>409 エスパーさんありがとう。 皆さん混乱させてスイマセンでした。置き換えと言えばsedしか知らなかったので。 文字列unkoの行を見つけてから文字列chinkoの行まで表示 ってどうやればいいの? >>420 当たり前過ぎるから回答は控えるけど、 エスパーすると -n オプション忘れて全部の行が表示されてしまったってオチだろな そんなことなくてその当たり前すぎる内容がわからない初心者さんなんでしょう。 回答してあげないなんてひどいね >>421 あ、-n だけのことだったんですね。失礼しました。 >>422 そこまで初心者じゃないです。 初心者の土瓶口だけど、chinkoの前の行まで表示 ってのはできるの? >>425 /start/,/end/{/end/!p} >>426 いや、それは知ってるよ。 そういうことせずに直接○○の行の手前まで指定はできないのか聞いてるんだが >>428 startを含まず、endを含む場合 sed -n '1,/start/b; 1,/end/p' みんな1行野郎なの? スクリプトファイルは書かないの? >>430 スクリプト書くほどならperlで書いちゃう perlは英語のマニュアルが読めなくて挫折した。あんときperlがんばっとけばよかったorz DTPでテキストの整形するとき、いっぱい痴漢(←なぜか第一候補)するよ。 >>432 俺はPerlは書籍で覚えたな、ラクダとあと何かUnixツールとして使うための本 教えてください! テキストファイルの最後にある空行を削除するにはどうすればいいですか? $ sed -n ' 105,$p' Ga.inp search.LowerE -3.000 # default=-3.000 (Hartree) search.UpperE 20.000 # default=20.000 (Hartree) num.of.partition 1200 # default=300 matching.point.ratio 0.67 # default=0.67 の様に、最後に無駄な空行のあるファイルがたくさんあって、一括削除したいのです。 ただし、途中にある改行は、ファイルの見やすさのために残しておきたいのです。 ed で言えば $;?^.?;+,$d で出来ると思うのですが、sed では';'や'+'が使えず、どうしてよいやら・・・ パターンスペースが 空行だったらホールドスペースに追加 空行でなかったらホールドスペースを出力後にパターンスペース出力 最後の連続空行はホールドスペースに収まったままで終わる。 とか考えてみたがあってるだろうか。 Nコマンドを使っていて必要な最期の行を全部すっとばしたことが、私にもありました >>437 多分やりたいのはそれだと思います。 具体的に同書けばいいのでしょう? もうawkかなにかで済ましてるだろうけど練習 437とは違うやり方になった sed -n -e ' :loop /^\n*$/{ N b loop } p ' >>440 ありがとうございます! うまくいきました。 gsedですが、 ブラケット開きがあって、ブラケット閉じ以外のものが1つ以上あって、ブラケット閉じがある場合、 で、これどこがおかしいのでしょうか? ★☆が現れてくれないんですけど。 s/\[\([^\]][^\]]*\)]/[★\1☆]/g >>442 バックスラッシュが余計 sed 's/\[\([^]][^]]*\)]/[★\1☆]/g' ありがとうございます。 つまり、[ と ] の間にあるものはどんなものでも 「これは文字です」と宣言しなくてもいい(\が要らない)ということですか。 やってみます。ありがとうございました。 >>444 そうなんだけど、] の場合は、[^ の直後にある場合のみ 普通の文字の ] とみなすという仕様。( [ の直後でも同様) テキスト [aaa], [bbb] <あああ>の(アアア)と<いいい>の(イイイ) 欲しい結果 ★aaa☆, ★bbb☆ ★あああ☆の★アアア☆と★いいい☆の★イイイ☆ s/[<[(]\([^<>[]()][^<>[]()]*\)[>])]/★\1☆/g 予想はしたけど、まるで反応してくれません。 半角の約物3種類は欲張ったかなあ、と1つずつやってみているところです。 >>446 >>445 に書いてあること読めよ。 [^ の直後に ] を置かないと、普通の文字としては認識されないんだよ。 [^....] の中の .... の順番を変えろということ。 >>446 s/[[<(]\([^]<>()][^]<>()]*\)[]>)]/★\1☆/g >>447-448 ああ、すみません。言葉が足りませんでした。読んだ上でわざと変えてみたのです。 ごめんなさい。>>446 は[]の中の[]に全部\を付けたつもりでした(このミスが大元ですね) エスケープすればどの位置にあっても文字とするというsedを使っていたのと、 最長一致の正規表現も使っていたので混乱してしまいました。 「直後」を何度も言われていたのに、「直後『だけ』」に思いが至りませんでした。 gsed で、置換コマンドの s を間違えて a と入力したスクリプトを実行したら、 一行ごとにその行が挿入されていて笑ってしまった。 a コマンドなんて知らなかったわ。 gsed って置換するときにタグの数が合ってなくてもエラーが出ないのね。 質問があります テキストファイルaaaの中身 <hoge> abc </hoge> <hoge> def </hoge> これを <hoge> def </hoge> のようにabcのタグだけ削除したい sed -i "/^<hoge>\n abc\n<\/hoge>/d" aaa これでは削除できませんでした。 改行を含む文字列を削除する場合どうしたらいいでしょうか? 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ちゃんねる