X



sed

0001名無しさん@お腹いっぱい。
垢版 |
NGNG
sedスレッド
0058名無しさん@お腹いっぱい。
垢版 |
2005/03/30(水) 12:32:32
大岡山のキティに英語の勉強しろといわれたので、伊藤和夫先生のテキストで勉強しました

-xx-xx-xxなperlは、使用しない故スティーブンス先生にも意見を聞きたいので
>>59
召還ヨロシク
0062名無しさん@お腹いっぱい。
垢版 |
2005/05/09(月) 16:07:16
質問です。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 とするにはどうすれば良いのでしょうか。

よろしくお願いします。
0063名無しさん@お腹いっぱい。
垢版 |
2005/05/09(月) 16:38:04
>>62
man sed しました?
man sed の SEE ALSO 見ると、
GNU sed が regex(7) (POSIX 1003.2) に (大体) 準拠してるとあると思いますが、
POSIX 1003.2 に non greedy な量指定子は無いです。

何か他の方法をとる必要があるかと。
0065名無しさん@お腹いっぱい。
垢版 |
2005/05/10(火) 18:46:02
abc xyzをaxbyczにしたいのですが
0070名無しさん@お腹いっぱい。
垢版 |
2005/05/18(水) 19:10:25
68は「大岡山のキティ」本人で複数の人間に「英語の勉強しろ」と言っていた、
という可能性は無いの。
0072名無しさん@お腹いっぱい。
垢版 |
2005/05/27(金) 13:57:14
GNU sedのVersion 4で、マルチバイトパッチをあてたVsersion 3みたく文字コー
ドを決めうちして変換する(ctype=EUCみたいに)方法はないのでしょうか。
jiskan16.bdfに外字を足してテキスト処理をやっているのですが、行頭に外字の
コードがくると、Version 4.1.4では誤認識してしまうのをなんとかしたいのです
が。
0081名無しさん@お腹いっぱい。
垢版 |
2005/05/29(日) 13:38:42
>>77

情報小出しですみません。LNAGは設定してます。
ググってもsedの古いソースがみつからなかったので、とりあえずは、Vine2.6
の3.0.2 (だかなんだかの)のバイナリを入れて動かしてますんで、当面は困っ
てはいないのですが、システムのバージョン上げるときに、個別対応する項目
が増えるのは面倒だなと思って質問した次第です。
0082名無しさん@お腹いっぱい。
垢版 |
2005/05/30(月) 01:02:38
>>81

GNU sedは4.xでマルチバイト文字対応が別の形で入ってるからね。
3.Xのローカライズパッチではそれほど厳密には検査されなかった
文字範囲が厳しくなってる可能性がある。

内部的には wide character に変換してごにょごにょしてるんだけど、
外字だとここでひっかかるのかもね。最悪自分でソースに手を入れて
wrapper関数書くしかないかも(外字をPUAにわりあてちゃうとか)。
0083名無しさん@お腹いっぱい。
垢版 |
2005/05/31(火) 23:18:23
>>81

> ググってもsedの古いソースがみつからなかったので、

Ring server にあらかたのバージョンあったよ。
もちろん日本語対応パッチはそこにはないんだけど
(これはほかを探せばある)。
0086名無しさん@お腹いっぱい。
垢版 |
2005/06/10(金) 23:23:16
>>84,85
Nに加えて、sなどで意図的にパターンスペースに改行を入れることもあるよ。
Nを行の先読みに例えれば、後者は行の差込み挿入のような意図で行うんだけど。
その場合にもdとDの違いが出る。
0087名無しさん@お腹いっぱい。
垢版 |
2005/07/15(金) 08:19:58
半角かなを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由来だからここで伺ってます
すみません
009087
垢版 |
2005/07/15(金) 13:03:54
>>88
すみません、nkfで上記の置換を行う方法がわかりません
よければ教えてください

>>89
可能であれば、windowsで動作した方がいろいろと好都合
ですので...
0091名無しさん@お腹いっぱい。
垢版 |
2005/07/15(金) 13:21:49
>>90
UNIX上のsedでは動作

sedの文法はそれで間違ってない

Win版のsedのバグまたは仕様

UNIX板でこれ以上聞いても無駄
009287
垢版 |
2005/07/15(金) 13:23:40
88、89さん申し訳ありません
wiodows上でのsedでも87のsed置換は可能です
私の勘違いでした

改めて質問させていただきます

設定済みmeadowを使って
リージョンを設定して
M+shift+|で87のsedスクリプトを走らせた場合
\になってほしい部分が化けてしまいます

原因や対処方法がおわかりに方がいらっしゃったら
ご教示願えませんでしょうか?
009487
垢版 |
2005/07/15(金) 13:52:19
>>93
ヒントありがとうございます

上述したように
リージョンにコマンドを渡す方法を使う場合

set-process-coding-systemの記述は

どこに、こんな風に記述すればよろしいのでしょうか?

頭が悪いので設定方法がわかりません
よろしければ教えてください
0096名無しさん@お腹いっぱい。
垢版 |
2005/07/17(日) 00:37:09
>>92
半角かなばっかりの文書を置換するのはできるみたいですが
漢字が混じってたら漢字は化けます
対処方法がありますか?
0097名無しさん@お腹いっぱい。
垢版 |
2005/07/17(日) 04:56:30
>>96
> 対処方法がありますか?

おまえ朝鮮人のにおいがぷんぷんするんだが。
やっぱり朝鮮人だったか。おねがいだから、国に帰ってくれ。
0098名無しさん@お腹いっぱい。
垢版 |
2005/08/02(火) 11:01:13
sed /^$/q

が「最初の空行までを出力する」ということで、メールのファイルからヘッダ部分を
抜き出すのに使えることがわかったのですが、その逆「最初の空行から後を出力
する」のはどうするのがよいでしょうか?

「sed ではなく○○を使え」とかいうことになるのかもしれませんが……
010098
垢版 |
2005/08/03(水) 00:43:23
>99
なるほど。「最初から空行までを削除する」と読むわけですか。

98の「空行が見つかったら終了する」も奥が深いと思ったのですが、まだまだ精進が
足りませんね。ありがとうございました。
0101名無しさん@お腹いっぱい。
垢版 |
2005/08/30(火) 15:38:56
age
0103名無しさん@お腹いっぱい。
垢版 |
2005/10/12(水) 15:14:18
$ 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
と出力されてしまいます.
うまい方法はありませんか?
0105103
垢版 |
2005/10/12(水) 15:47:46
>>104
なるほど!
どうもありがとうございます.
0106名無しさん@お腹いっぱい。
垢版 |
2005/11/24(木) 20:57:48
コマンドラインオプションの -n がよく理解できないんですが、どういう場面で使えばいいんでしょうか
0120名無しさん@お腹いっぱい。
垢版 |
2006/02/08(水) 18:38:37
@
0122名無しさん@お腹いっぱい。
垢版 |
2006/04/12(水) 02:41:13
深夜上げ
0123名無しさん@お腹いっぱい。
垢版 |
2006/08/22(火) 16:18:15
ウムムム
0128名無しさん@お腹いっぱい。
垢版 |
2006/11/18(土) 10:13:03
教えてください。
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

ご存知でしたら、ご教授ください。
よろしくお願いします。
0130名無しさん@お腹いっぱい。
垢版 |
2006/11/18(土) 12:30:05
>>129
突っ込みだけでスマン。それだと、
111,222999999999,333,444
なんていうのがaaa.csvにあると、これも削除されるぞ。

数字の桁数が自由か固定かあいまいな>>128がいけないんだが、
sedの置換先は /^\1,\2,/ みたいなんの方が安全と思う。

0131名無しさん@お腹いっぱい。
垢版 |
2006/11/18(土) 20:48:36
>>129-130さんありがとうございました。
大変、参考になります。
私の説明がいけなかったのですが、
aaa.csvの1カラム目と2カラム目は固定ではなく、自由です。
ですので、
--aaa.csv--
11111,2222,333,444
55,666666,777,888
のような場合もあるのです。

また、file1.txtのほうも固定ではなく、
--file1.txt--
1111111222
555666
2233333
とスペースが入っている場合すらあります。

度々で恐縮ですが、
ご存知でしたら、ご教授ください。
よろしくお願いします。

0137名無しさん@お腹いっぱい。
垢版 |
2006/12/07(木) 00:21:57
ご存知でしたら、教えてください。
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
}
}
-----------------------------------------------------
0138名無しさん@お腹いっぱい。
垢版 |
2006/12/07(木) 20:54:41
>>137
awk -f test.awk -v HENSU=${HENSU}
じゃね?
確認はできんが
0139名無しさん@お腹いっぱい。
垢版 |
2007/02/04(日) 08:46:50
ある文字列を
現在時間+引数
に置換したいのですが、どのようにすればいいですか?

perlを使えば簡単なんだけど、職場のマシンでperl が入ってなかった(汗)

ちなみに、sed とawk は使えるみたいです。
0140名無しさん@お腹いっぱい。
垢版 |
2007/02/06(火) 00:47:03
>>139
引数によるけど、dateコマンドが使えてたら、OKでは。
$ date +%R
00:45
$ date --date '6 min ago' +%R
00:39
という感じで引数を与えるといけると思う
0141名無しさん@お腹いっぱい。
垢版 |
2007/02/11(日) 21:34:20
入力ファイルを書き換えることはできる?

% sed 's/ABC/abc/' input.txt > output.txt
よくある上のようなプログラム(と呼ぶのかな?)で、
出力をoutput.txt
じゃなくてinput.txt のファイル自身を書き換えたいんだけど、可能かな?

つまり、余計なファイルは出力させたくないんだよ。
0143141
垢版 |
2007/02/11(日) 21:57:51
>>142
情報サンクス
a. の方法を用いました
0144名無しさん@お腹いっぱい。
垢版 |
2007/02/11(日) 22:27:47
問題解決したようだけどこぴぺして編集

・-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 オプションは無い)

0148名無しさん@お腹いっぱい。
垢版 |
2007/04/16(月) 23:15:15
仕事で root してる人に質問です。
皆さんどれぐらい仕事で sed スクリプト書いてます?

スクリプトの後々のメンテナンスと、既に周囲に読める人があまり
居ないこととを考えると、s での置換以外では perl を使うか、そ
うなったらもう全部 perl にした方がいいのかなと最近思ったりし
ます。

6行の sed スクリプトを書いたのですが、コメントが 8 行になっ
てしまって。。。
0151名無しさん@お腹いっぱい。
垢版 |
2007/04/18(水) 23:42:12
>>148
すぐに読めなくても、それがsedのスクリプトであることを書いておけば、
perlを使えるひとならちょっとの手間で読めるようになるでしょ。
そうでなければ>>150ということに。

それから、6行のスクリプトのコメントが8行になっても、それはそれでいいじゃないか。
0152名無しさん@お腹いっぱい。
垢版 |
2007/04/19(木) 01:05:48
sedの複数行は本当に頭痛がしてくる。
perでlさえ可読性悪いと言われてるのにその比じゃない。
個人的趣味以外で書いてはいけない
0153名無しさん@お腹いっぱい。
垢版 |
2007/04/21(土) 01:38:29
sed のコードのそばに、
それを perl なり awk なりで書いたものを
コメントとして残せば
・可読性→クリア
・コメント行数→クリア
・メンテ→工数倍w
0158名無しさん@お腹いっぱい。
垢版 |
2007/06/04(月) 20:43:16
単語の置換をしたいんだけど、どうしたらよいでしょうか


具体的な例で言うと、あるソース中の int を char に全置換したい
んだけど 単純に sed "s/int/char/g" だと printf まで変わって
しまうから それは避けたい。
「単語」の条件は 英数字+アンダースコア (\w+) であること。

これ絶対FAQだと思うんだけど、 「sed 単語 置換」 で検索しても
答にたどり着かなかったのですよ。 困った。
レスを投稿する


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