sed
大岡山のキティに英語の勉強しろといわれたので、伊藤和夫先生のテキストで勉強しました -xx-xx-xxなperlは、使用しない故スティーブンス先生にも意見を聞きたいので >>59 召還ヨロシク sed 's/い/お/g' file で、 file内の「いっぱい」が「おっぱい」に置換されるのは、 正 常 ! s/い/お/g ←「g」付きだと置換結果は「おっぱお」じゃないの? 質問です。bashにてGnu sed ver4.0.9を用いて echo hoge,uge,hage,age,sage | sed 's/uge,.*\?,//g' を実行しました。 hoge,age,sage が出力されることを期待したのですが、実際の出力は hoge,sage でした。 *や+の後に?を指定すると、例えばperl,pythonなんかでは *や+は non greedy となるので、 sedでもそうなるものと考えてたのですが、何か間違っていたのでしょうか。 また、*や+を non greedy とするにはどうすれば良いのでしょうか。 よろしくお願いします。 >>62 man sed しました? man sed の SEE ALSO 見ると、 GNU sed が regex(7) (POSIX 1003.2) に (大体) 準拠してるとあると思いますが、 POSIX 1003.2 に non greedy な量指定子は無いです。 何か他の方法をとる必要があるかと。 ありがとうございます、とりあえず>62に関しては 's/uge,[^,]*,//' とすることにします。 >>58 > 大岡山のキティに英語の勉強しろといわれたので、伊藤和夫先生のテキストで勉強しました だれ? >>65 echo abc xyz |sed -e "s/^/%/; :ll; s/[%]\(.\)\(.*\) \(.\)\(.*\)/\1\3%\2 \4/; tll; s/%//;" >>66 >だれ? は、 >大岡山のキティ >伊藤和夫 の以上2つのうち誰の素性を知りたいのだね? 68は「大岡山のキティ」本人で複数の人間に「英語の勉強しろ」と言っていた、 という可能性は無いの。 >>70 「大岡山のキティ」に心当たりがあるなら>>66 のためにも、sedのsコマンドで「大岡山のキティ」を痴漢するってのは如何 GNU sedのVersion 4で、マルチバイトパッチをあてたVsersion 3みたく文字コー ドを決めうちして変換する(ctype=EUCみたいに)方法はないのでしょうか。 jiskan16.bdfに外字を足してテキスト処理をやっているのですが、行頭に外字の コードがくると、Version 4.1.4では誤認識してしまうのをなんとかしたいのです が。 FreeBSDでutf-8なロケールでgrep使えばOK。 sedで四則演算系は作れますか? 理由も教えてください。 >>72 bashを使っているとして、LANG=ja_jp.eucJP sed -e "s/hogehoge/fugaguga/" みたいなのじゃダメなの? >>77 情報小出しですみません。LNAGは設定してます。 ググってもsedの古いソースがみつからなかったので、とりあえずは、Vine2.6 の3.0.2 (だかなんだかの)のバイナリを入れて動かしてますんで、当面は困っ てはいないのですが、システムのバージョン上げるときに、個別対応する項目 が増えるのは面倒だなと思って質問した次第です。 >>81 GNU sedは4.xでマルチバイト文字対応が別の形で入ってるからね。 3.Xのローカライズパッチではそれほど厳密には検査されなかった 文字範囲が厳しくなってる可能性がある。 内部的には wide character に変換してごにょごにょしてるんだけど、 外字だとここでひっかかるのかもね。最悪自分でソースに手を入れて wrapper関数書くしかないかも(外字をPUAにわりあてちゃうとか)。 >>81 > ググってもsedの古いソースがみつからなかったので、 Ring server にあらかたのバージョンあったよ。 もちろん日本語対応パッチはそこにはないんだけど (これはほかを探せばある)。 >>84 ,85 Nに加えて、sなどで意図的にパターンスペースに改行を入れることもあるよ。 Nを行の先読みに例えれば、後者は行の差込み挿入のような意図で行うんだけど。 その場合にもdとDの違いが出る。 半角かなをsedで一括置換しようと 下のようなスクリプトを試しましたが うまくいきません 解決策を教えてください s/タ/\\={a}/g s/ツ/\\={\\i}/g s/ト/\\={u}/g s/ニ/\\uc{r}/g s/ヌ/\\uc{\\={r}}/g s/ハ/\\uc{l}/g s/゙/\\d{h}/g s/ワ/\\d{m}/g s/フ/\\.{n}/g s/ホ/\\~n/g OSはwindowsXPですが sedはunix由来だからここで伺ってます すみません >>87 UNIX上のsedなら、それでちゃんと動作するよ。 >>88 すみません、nkfで上記の置換を行う方法がわかりません よければ教えてください >>89 可能であれば、windowsで動作した方がいろいろと好都合 ですので... >>90 UNIX上のsedでは動作 ↓ sedの文法はそれで間違ってない ↓ Win版のsedのバグまたは仕様 ↓ UNIX板でこれ以上聞いても無駄 88、89さん申し訳ありません wiodows上でのsedでも87のsed置換は可能です 私の勘違いでした 改めて質問させていただきます 設定済みmeadowを使って リージョンを設定して M+shift+|で87のsedスクリプトを走らせた場合 \になってほしい部分が化けてしまいます 原因や対処方法がおわかりに方がいらっしゃったら ご教示願えませんでしょうか? set-process-coding-system >>93 ヒントありがとうございます 上述したように リージョンにコマンドを渡す方法を使う場合 set-process-coding-systemの記述は どこに、こんな風に記述すればよろしいのでしょうか? 頭が悪いので設定方法がわかりません よろしければ教えてください >>94 ずっと効くから.emacs に書いとけ。 >>92 半角かなばっかりの文書を置換するのはできるみたいですが 漢字が混じってたら漢字は化けます 対処方法がありますか? >>96 > 対処方法がありますか? おまえ朝鮮人のにおいがぷんぷんするんだが。 やっぱり朝鮮人だったか。おねがいだから、国に帰ってくれ。 sed /^$/q が「最初の空行までを出力する」ということで、メールのファイルからヘッダ部分を 抜き出すのに使えることがわかったのですが、その逆「最初の空行から後を出力 する」のはどうするのがよいでしょうか? 「sed ではなく○○を使え」とかいうことになるのかもしれませんが…… >99 なるほど。「最初から空行までを削除する」と読むわけですか。 98の「空行が見つかったら終了する」も奥が深いと思ったのですが、まだまだ精進が 足りませんね。ありがとうございました。 $ cat hoge.txt A\textrm{1}\textrm{23}\textit{456}B A\textrm{1}\textit{23}\textrm{456}B のようなファイルがあるとして \textrm{}を取り除いて A123\textit{456}B A1\textit{23}456B を取り出したいと思い $ < hoge.txt sed 's/\\textrm{\(.*\)}/\1/g' と書きましたが,括弧の対応を外側から取るようで A1}\textrm{23}\textit{456B A1}\textit{23}\textrm{456B と出力されてしまいます. うまい方法はありませんか? {\(.*\)}の部分が最長マッチしちゃんだから、ここのマッチが}で切れるよう {\([^}]*\)}に変えればいい。 >>104 なるほど! どうもありがとうございます. コマンドラインオプションの -n がよく理解できないんですが、どういう場面で使えばいいんでしょうか >>111 否定疑問文だから、英語で答えるなら "No" が正解だろ。 >>111-113 Thank you all. 知恵と勇気と愛でなんとかしてみる 否定疑問文に 「んなことない」みたいな答え方はどうしたらいい? >>115 「んなことない」= "There is no such Japanese zither." このシリーズはなんとなく印象が悪いので手にとってないな。そういえば。 教えてください。 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 ご存知でしたら、ご教授ください。 よろしくお願いします。 >>128 sed 's/\(...\)\(...\)/^\1,\2/' file1.txt | egrep -f- -v aaa.csv >>129 突っ込みだけでスマン。それだと、 111,222999999999,333,444 なんていうのがaaa.csvにあると、これも削除されるぞ。 数字の桁数が自由か固定かあいまいな>>128 がいけないんだが、 sedの置換先は /^\1,\2,/ みたいなんの方が安全と思う。 >>129-130 さんありがとうございました。 大変、参考になります。 私の説明がいけなかったのですが、 aaa.csvの1カラム目と2カラム目は固定ではなく、自由です。 ですので、 --aaa.csv-- 11111,2222,333,444 55,666666,777,888 のような場合もあるのです。 また、file1.txtのほうも固定ではなく、 --file1.txt-- 1111111222 555666 2233333 とスペースが入っている場合すらあります。 度々で恐縮ですが、 ご存知でしたら、ご教授ください。 よろしくお願いします。 >>131 仕事で必要ならコンサルタントを雇いなさい。 職場のマシン、perlが入ってなかった・・・ orz この場合は、sedよりawkなんかな? awkで書いてスピードアップのためのawkccしてしまうとか。 ご存知でしたら、教えてください。 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 } } ----------------------------------------------------- >>137 awk -f test.awk -v HENSU=${HENSU} じゃね? 確認はできんが ある文字列を 現在時間+引数 に置換したいのですが、どのようにすればいいですか? perlを使えば簡単なんだけど、職場のマシンでperl が入ってなかった(汗) ちなみに、sed とawk は使えるみたいです。 >>139 引数によるけど、dateコマンドが使えてたら、OKでは。 $ date +%R 00:45 $ date --date '6 min ago' +%R 00:39 という感じで引数を与えるといけると思う 入力ファイルを書き換えることはできる? % sed 's/ABC/abc/' input.txt > output.txt よくある上のようなプログラム(と呼ぶのかな?)で、 出力をoutput.txt じゃなくてinput.txt のファイル自身を書き換えたいんだけど、可能かな? つまり、余計なファイルは出力させたくないんだよ。 >>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 あたりを参照 >>142 情報サンクス a. の方法を用いました 問題解決したようだけどこぴぺして編集 ・-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 オプションは無い) 仕事で root してる人に質問です。 皆さんどれぐらい仕事で sed スクリプト書いてます? スクリプトの後々のメンテナンスと、既に周囲に読める人があまり 居ないこととを考えると、s での置換以外では perl を使うか、そ うなったらもう全部 perl にした方がいいのかなと最近思ったりし ます。 6行の sed スクリプトを書いたのですが、コメントが 8 行になっ てしまって。。。 >>148 すぐに読めなくても、それがsedのスクリプトであることを書いておけば、 perlを使えるひとならちょっとの手間で読めるようになるでしょ。 そうでなければ>>150 ということに。 それから、6行のスクリプトのコメントが8行になっても、それはそれでいいじゃないか。 sedの複数行は本当に頭痛がしてくる。 perでlさえ可読性悪いと言われてるのにその比じゃない。 個人的趣味以外で書いてはいけない sed のコードのそばに、 それを perl なり awk なりで書いたものを コメントとして残せば ・可読性→クリア ・コメント行数→クリア ・メンテ→工数倍w s2pでいいじゃん、とかおもったりおもわなかったり sedで千行あるファイルの 100行目から150行目を 抜き出すには どうしたらいいですか 単語の置換をしたいんだけど、どうしたらよいでしょうか 具体的な例で言うと、あるソース中の int を char に全置換したい んだけど 単純に sed "s/int/char/g" だと printf まで変わって しまうから それは避けたい。 「単語」の条件は 英数字+アンダースコア (\w+) であること。 これ絶対FAQだと思うんだけど、 「sed 単語 置換」 で検索しても 答にたどり着かなかったのですよ。 困った。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる