Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
Dismiss

ディレクトリ内ファイル一括置換

閲覧: 20 回
最初の未読メッセージにスキップ

Shigeo Ebata

未読、
2004/01/28 8:53:212004/01/28
To:
<文字化けのため再掲>
同一ディレクトリ内の300個のFORTRANソースコード(*.F)に対して下記のように一括置換する必要が生じました。
最適な方法を御教示願います。

(置換前) include 'XXXXX'
(置換後) #include "XXXXX" (注:XXXXはファイル毎に異なる)

perl等で行う方法は公開されていますが、置換後の文字列に$1等は使えない様です。
(http://www.web-ware.org/cgi/ssm2/np/tools_desc.html?file=menu_convert)

NIDE Naoyuki

未読、
2004/01/28 9:33:412004/01/28
To:
In article <3a862257.04012...@posting.google.com>,

shigeo...@ybb.ne.jp writes:
> 同一ディレクトリ内の300個のFORTRANソースコード(*.F)に対して下記のように一括置換する必要が生じました。
> 最適な方法を御教示願います。
>
> (置換前) include 'XXXXX'
> (置換後) #include "XXXXX" (注:XXXXはファイル毎に異なる)

perl -i -pe 's/^include '"'([^']*)'"'/#include "$1"/' *.F

とかですかね。
ni...@ics.nara-wu.ac.jp

IKEDA Kenji

未読、
2004/01/28 9:38:072004/01/28
To:
On 28 Jan 2004 05:53:21 -0800,
In article <3a862257.04012...@posting.google.com>,
shigeo...@ybb.ne.jp (Shigeo Ebata) wrote:

> 最適な方法を御教示願います。

google から投稿しない。

> perl等で行う方法は公開されていますが、置換後の文字列に$1等は使えない様です。

本当に perl -pi -e 's/include '"'"'(\S+)'"'"'/include "$1"/g' *.F が
使えないなら、それは perl じゃないんでしょ。

--
池田研二 稲城駅前在住

ku...@gssm.otsuka.tsukuba.ac.jp

未読、
2004/01/28 9:00:592004/01/28
To:
久野です。

shigeo...@ybb.ne.jpさん:
> 同一ディレクトリ内の300個のFORTRANソースコード(*.F)に対して下
> 記のように一括置換する必要が生じました。最適な方法を御教示願い


> ます。
> (置換前) include 'XXXXX'
> (置換後) #include "XXXXX" (注:XXXXはファイル毎に異なる)

mkdir tmp
for i in *.F
do
sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
done

こんな感じですかね。

> perl等で行う方法は公開されていますが、置換後の文字列に$1等は使
> えない様です。

エスケープすればいいんじゃないの。 久野


Hiroshi Fujishima

未読、
2004/01/28 11:29:282004/01/28
To:
ku...@gssm.otsuka.tsukuba.ac.jp writes:

> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i

sed "s/include \'\(.*\)\'/#include \"\\1\"/" $i >tmp/$i

ですよね?
ところで、for i の i ってどういう意味があるんですか?

--
Hiroshi Fujishima

Junn Ohta

未読、
2004/01/28 12:02:032004/01/28
To:
fj.unixの記事<86r7xk2...@edge.first.tsukuba.ac.jp>で
hir...@first.tsukuba.ac.jpさんは書きました。

> ところで、for i の i ってどういう意味があるんですか?

FORTRAN IVの暗黙の型宣言でI~Nで始まる変数は整数型
になっていたので、
DO 10 I = 1,100
のようにIは整数のループ制御変数のデフォルトとして
使われるようになりました。その慣習が言語を超えて現
在まで連綿として続いているという話。

...なので整数でないループにiを使うのはあまり意味が
ないんですよね。でも私もfor i inだなあ...。(^^;
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp

Shinji KONO

未読、
2004/01/28 19:47:472004/01/28
To:
河野真治 @ 琉球大学情報工学です。

せっかく fj.comp.lang.fortranが使える機会だったのに~

In article <bv8pub$bne$1...@ns.src.ricoh.co.jp>, oh...@src.ricoh.co.jp (Junn Ohta) writes


> ...なので整数でないループにiを使うのはあまり意味が
> ないんですよね。でも私もfor i inだなあ...。(^^;

index の i って説があったかなぁ。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球大学工学部情報工学科,

Hideo Sir MaNMOS Morishita

未読、
2004/01/28 20:09:372004/01/28
To:

In article <bv8pub$bne$1...@ns.src.ricoh.co.jp>,

oh...@src.ricoh.co.jp (Junn Ohta) writes:
> fj.unixの記事<86r7xk2...@edge.first.tsukuba.ac.jp>で
> hir...@first.tsukuba.ac.jpさんは書きました。
> > ところで、for i の i ってどういう意味があるんですか?
>
> FORTRAN IVの暗黙の型宣言でI~Nで始まる変数は整数型
> になっていたので、
> DO 10 I = 1,100
> のようにIは整数のループ制御変数のデフォルトとして
> 使われるようになりました。その慣習が言語を超えて現
> 在まで連綿として続いているという話。
>
> ...なので整数でないループにiを使うのはあまり意味が
> ないんですよね。でも私もfor i inだなあ...。(^^;

私はshell scriptの時にファイルならfディレクトリならdを使ってます。
大抵、その変数の意味を持つ物のイニシャルが多いです。

ただ、なんも考えずにfのこともたまにあります。

--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37

Tomoaki Akiyama

未読、
2004/01/28 22:29:032004/01/28
To:
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> index の i って説があったかなぁ。

「indexの先頭二文字で、iからn」という覚え方もどこかで読みました。

--

Tomoaki Akiyama 秋山 智朗
mailto:tomoaki...@akiyama.nu
http://tomoaki.akiyama.nu/

Shiino Masayoshi

未読、
2004/01/28 22:38:582004/01/28
To:
In article <bv8pub$bne$1...@ns.src.ricoh.co.jp> oh...@src.ricoh.co.jp (Junn Ohta) writes:
>fj.unixの記事<86r7xk2...@edge.first.tsukuba.ac.jp>で
> hir...@first.tsukuba.ac.jpさんは書きました。
>> ところで、for i の i ってどういう意味があるんですか?

>FORTRAN IVの暗黙の型宣言でI~Nで始まる変数は整数型
>になっていたので、
> DO 10 I = 1,100
>のようにIは整数のループ制御変数のデフォルトとして
>使われるようになりました。その慣習が言語を超えて現
>在まで連綿として続いているという話。

数学の本なんか見ても、添字に i, j, k, ... を使う事が結構あります。
大体、定数には n, m 辺りを、変数として i, j, ...を使う様な気がしま
すね。余りコンピュータに縁の無い van der Verden でも使ってたと思い
ますんで、FORTRAN と言うかコンピュータ言語以前からの風習でしょう。
語源としては、n が Numbre 、i は河野さんの仰る通りIndex てな所でしょ
う。Integer も考えられますが、添字が整数でなくてもどころか一般の集
合の元であっても使う事が有るんで、Index に一票。

>...なので整数でないループにiを使うのはあまり意味が
>ないんですよね。でも私もfor i inだなあ...。(^^;

集合論では、一般の集合の元てえ事もあります。別に構わないのでは? :-)
--
椎野正元 (しいの まさよし)

Junn Ohta

未読、
2004/01/28 23:09:382004/01/28
To:
fj.unixの記事<bv9v8i$219j$1...@mozart.shiino.taito.tokyo.jp>で
alc...@shiino.taito.tokyo.jpさんは書きました。

> 数学の本なんか見ても、添字に i, j, k, ... を使う事が結構あります。
> ...
> ますんで、FORTRAN と言うかコンピュータ言語以前からの風習でしょう。

考えてみればおっしゃるとおりで...。(>_<;

ku...@gssm.otsuka.tsukuba.ac.jp

未読、
2004/01/28 23:14:092004/01/28
To:
久野です。

oh...@src.ricoh.co.jpさん:
> 考えてみればおっしゃるとおりで...。(>_<;

まじっすか :-)

プログラムは書けるが数式はダメとかさ :-) :-) 久野

P.S. for(int a = ...) なんてのを見ると気持ち悪いですよね。


Junn Ohta

未読、
2004/01/29 0:02:242004/01/29
To:
fj.unixの記事<bva1ah$1t...@utogw.gssm.otsuka.tsukuba.ac.jp>で
ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
> プログラムは書けるが数式はダメとかさ :-) :-) 久野

数学ホントだめなんです。大学入試のときも自己採点で
200点満点中20点しかとれてなかったし。(;_;

# 誤り訂正アルゴリズムの解説を書くのにリード・ソロ
# モン符号を調べているのだけど、ガロア体とか出てき
# てもうたいへん。(>_<;

Takao Ono

未読、
2004/01/29 0:20:312004/01/29
To:
小野@名古屋大学 です.

<bva450$p3p$1...@ns.src.ricoh.co.jp>の記事において
oh...@src.ricoh.co.jpさんは書きました。
ohta> # 誤り訂正アルゴリズムの解説を書くのにリード・ソロ
ohta> # モン符号を調べているのだけど、ガロア体とか出てき
ohta> # てもうたいへん。(>_<;
最初に「難しい数式を使うと読者の皆さんが読み疲れてしまうと思いま
すので, 極力数学は使わないようにします」とでも書いておけばいいの
ではないでしょうか.
# 実は「自分でもよくわかんないけど書けって言われたから書いてるだ
# けなんですごめんなさい全然理解できてません」をごまかすための口
# 実であることもあるけど.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男

ka...@sra-tohoku.co.jp

未読、
2004/01/29 9:30:082004/01/29
To:
shigeo...@ybb.ne.jp sed in <3a862257.04012...@posting.google.com>:

>> 同一ディレクトリ内の300個のFORTRANソースコード(*.F)に対して


>> (置換前) include 'XXXXX'
>> (置換後) #include "XXXXX" (注:XXXXはファイル毎に異なる)

他にフォローされている方々は単純な置換しかしてませんが、

FORTRANだと固定レコード長(一行80文字)でフォーマットしなければならぬ、
みたいな制限がついてないでしょうか?
#以前 UNIX<->3090でハマったことあり。

純FORTRANに #include はないので正確にはRATFORかなんかだと思われますが
--
kabe

ku...@gssm.otsuka.tsukuba.ac.jp

未読、
2004/01/29 0:38:062004/01/29
To:
久野です。

ka...@sra-tohoku.co.jpさん:
> FORTRANだと固定レコード長(一行80文字)でフォーマットしなければ
> ならぬ、みたいな制限がついてないでしょうか?

うーん、言語の問題というよりOSの問題に近いような。でもこの置換
の場合は文字数を変えないように空白文字を入れて調整できますよね。

> 純FORTRANに #include はないので正確にはRATFORかなんかだと思われますが

すっかり忘れているなあ。

F90くらいだとinclude文っていうのなかったっけ。 久野

Junn Ohta

未読、
2004/01/29 0:51:282004/01/29
To:
fj.unixの記事<0401291420...@flame.hirata.nuee.nagoya-u.ac.jp>で
ta...@hirata.nuee.nagoya-u.ac.jpさんは書きました。

> 最初に「難しい数式を使うと読者の皆さんが読み疲れてしまうと思いま
> すので, 極力数学は使わないようにします」とでも書いておけばいいの
> ではないでしょうか.

それは前にやりました。(^^;

> # 実は「自分でもよくわかんないけど書けって言われたから書いてるだ
> # けなんですごめんなさい全然理解できてません」をごまかすための

# ぎくぎく。

で、そのリード・ソロモン符号を使ってサンプルプログ
ラムも書かなければいけないので、やっぱり回避方法は
ないのかな、と。(>_<;

Takao Ono

未読、
2004/01/29 1:36:282004/01/29
To:
小野@名古屋大学 です.

Fortran2003 のドラフトを見ながら書きます. で, 一応
fj.comp.lang.fortran にふっておきます.

<bva67u$20...@utogw.gssm.otsuka.tsukuba.ac.jp>の記事において
ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
kuno> > FORTRANだと固定レコード長(一行80文字)でフォーマットしなければ
kuno> > ならぬ、みたいな制限がついてないでしょうか?
kuno> うーん、言語の問題というよりOSの問題に近いような。でもこの置換
kuno> の場合は文字数を変えないように空白文字を入れて調整できますよね。
いや, いにしえの FORTRAN では 1行 72文字という制限がありました.
で, 今の場合だと
include 'xxx'

#include "xxx"
にするので文字数が増えちゃう.

もっとも,
kuno> > 純FORTRANに #include はないので
どころか # って文字がなかったような....

kuno> F90くらいだとinclude文っていうのなかったっけ。 久野
Fortran2003 (のドラフト) にはないです (キッパリ).


--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男

P.S.
いや, INCLUDE line というものはあるけど
An INCLUDE line is not a Fortran statement.
って書かれてるし.

Hideo Sir MaNMOS Morishita

未読、
2004/01/29 6:41:192004/01/29
To:

In article <86hdyfe8...@sun.akiyama.nu>,

Tomoaki Akiyama <tomoaki...@akiyama.nu> writes:
> ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
>
> > index の i って説があったかなぁ。
>
> 「indexの先頭二文字で、iからn」という覚え方もどこかで読みました。

私はintegerからnumberまでって思ってました。

Tsubasa Ishida

未読、
2004/01/29 7:51:202004/01/29
To:
 石田@杉並です.

Hiroshi Fujishima さんは「Re: ディレクトリ内ファイル一括置換」
<86r7xk2...@edge.first.tsukuba.ac.jp>において曰く


> ところで、for i の i ってどういう意味があるんですか?

 iteration(繰り返し、反復)のiだときいたことがあります。

--
"Do you know what a metaphor is?"
"A component? Like a capacitor?"
From "Count ZERO" by W. Gibson
ISHIDA, Tsubasa <tb...@mbe.sphere.ne.jp>
Finger print = 3D9A B214 CBCE B309 748B 1399 BC5D 0DB6 945F CEE0

Shigeo Ebata

未読、
2004/01/29 9:09:432004/01/29
To:
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) wrote in message
> Fortran2003 (のドラフト) にはないです (キッパリ).

最初の投稿者です。
置換作業の生じたFORTRANソースは下記のとおりです。

(置換前) include 'XXXXX' ------ VisualFortran6.2(Win上)
(置換後) #include "XXXXX" ------ LaheyFortran95 (linux上)

lf95のマニュアルには明記されていないようなのですが、g77のマニュアル(info
g77)に下記の記述があり、上記のように変更したらlf95でコンパイルできました。しかしながら、同様サブルーチンが300程度あるため、一括変換の手法を質問したものです。
----------------------
Therefore, any file that contains preprocessor directives (such as
`#include', `#define', and `#if') must be included via the `#include'
directive, not via the `INCLUDE' directive. Therefore, any file
containing preprocessor directives, if included, is necessarily
included by a file that itself contains preprocessor directives.
-----------------------
実際、XXXXXのなかにも#define等を使っており、これを読んで納得した次第です。
(lf95とg77のマニュアルの共通性?につては不明ですが・・・・・。)
なお、拡張子を大文字の(*.F)で記したのはpreprocessorを通すためです。

最初のperlによる置換の問題から離れてしまいましたが・・・・

SAITOH akinori

未読、
2004/01/28 1:06:582004/01/28
To:
大阪大学の齊藤です

ku...@gssm.otsuka.tsukuba.ac.jp wrote:
> 久野です。


> mkdir tmp
> for i in *.F
> do
> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
> done


\( なんて難しい大技ですね。もっとシンプルに、
sed '/^include /s/^/#/' $i >tmp/$i

でいいのでは?

齊藤明紀 sai...@ist.osaka-u.ac.jp

NIDE Naoyuki

未読、
2004/01/30 9:36:072004/01/30
To:
In article <bvdn39$g0l$1...@newsserv.ics.es.osaka-u.ac.jp>,

sai...@ist.osaka-u.ac.jp writes:
> \( なんて難しい大技ですね。もっとシンプルに、
> sed '/^include /s/^/#/' $i >tmp/$i
> でいいのでは?

同時に「XXXXX」を囲む「' '」を「" "」にする処理もしたいので
こうなったのではないかと。
ni...@ics.nara-wu.ac.jp

Takashi SHIRAI

未読、
2004/01/30 10:29:192004/01/30
To:
 しらいです。

In article <bvdn39$g0l$1...@newsserv.ics.es.osaka-u.ac.jp>,
SAITOH akinori <sai...@ist.osaka-u.ac.jp> wrote:
>大阪大学の齊藤です
>
>ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>> 久野です。

 先生方にも筆の誤り?


>> mkdir tmp
>> for i in *.F
>> do
>> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
>> done

 普通の shell だと「'」を含むような文字列は "" で quote し
た方が記述し易いと思います。


sed "s/include '\(.*\)'/#include \"\1\"/" $i >tmp/$i

 久野センセのお使いの shell が何か存じませんが、私の確認出
来る範囲には、'' の中の「'」を「\」で escape 出来るような仕
様の shell は見つかりません。
 for の文法は Bourne shell のようですが、この script をその
まま試してみると、sh/ash/ksh/bash/zsh 全て継続行の入力を促さ
れます。

# 普通の shell 文法では '' の中の meta character は「'」自
#身のみなので、一個目の「\'」で quote が完了し、続く「\'」
#は escape されて文字「'」となり、最後の「'」で quote が始
#まります。
# Bourne shell 系だと quote された文字列を複数行に渡って記
#述出来るので、$PS2 を表示して入力待ちになりますが、csh 系
#では複数行を記述出来ないので、csh/tcsh では「' が一致しな
#い」旨の message を吐きますね。


>\( なんて難しい大技ですね。もっとシンプルに、
> sed '/^include /s/^/#/' $i >tmp/$i

 それだと「'」→「"」の変換が出来ませんから、s function を
もう一つ書かなくては。
sed "/^include /s/^/#/;s/'/\"/g" $i >tmp/$i
or
sed -e "/^include /{" -e "s/^/#/" -e "s/'/\"/g" -e "}" $i >tmp/$i

 sed の実装により文法が微妙に異なるので、このうちどちらが有
効かは環境依存ですが、場合によってはどちらも通らないかも知れ
ません。
 その場合 1liner では書けなくなりますが、こんな感じで書けば
どの sed でも通ると思います。
sed "/^include /{
s/^/#/
s/'/\"/g
}" $i >tmp/$i

--
しらい たかし

ku...@gssm.otsuka.tsukuba.ac.jp

未読、
2004/01/30 10:58:342004/01/30
To:
久野です。

shi...@unixusers.netさん:


>  久野センセのお使いの shell が何か存じませんが、私の確認出
> 来る範囲には、'' の中の「'」を「\」で escape 出来るような仕
> 様の shell は見つかりません。

そうですね、試してませんでした ^_^; 久野

P.S. 私は一生懸命quoteするよりファイルに入れて-fを使う方が好き
かも。複数コマンドも楽だし。

Mito

未読、
2004/01/30 12:15:452004/01/30
To:
shi...@unixusers.net (Takashi SHIRAI) writes:

>  先生方にも筆の誤り?
>
> >> mkdir tmp
> >> for i in *.F
> >> do
> >> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
> >> done
>
>  普通の shell だと「'」を含むような文字列は "" で quote し
> た方が記述し易いと思います。

" で quote する場合、* も quote が必要なんで、

> sed "s/include '\(.*\)'/#include \"\1\"/" $i >tmp/$i

sed "s/include '\(.\*\)'/#include \"\1\"/" $i >tmp/$i

でしょうか。

私は、

sed "s/include '\([^']+\)'/#include "'"\1"' $i >tmp/$i

あたりがおすすめかな。

>  それだと「'」→「"」の変換が出来ませんから、s function を
> もう一つ書かなくては。
> sed "/^include /s/^/#/;s/'/\"/g" $i >tmp/$i

sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i

のどっちでも同じだと思いますが、/^include /と一致しなかった
場合は t で最後まで吹っ飛ばす必要がありますよね。

もしくは、

> or
> sed -e "/^include /{" -e "s/^/#/" -e "s/'/\"/g" -e "}" $i >tmp/$i

と同じように、{ でブロック化して、

sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i

とか。

>  sed の実装により文法が微妙に異なるので、このうちどちらが有
> 効かは環境依存ですが、場合によってはどちらも通らないかも知れ
> ません。

そうなんですか?

そんなに色んな環境で sed をこねくりまわした経験はありません
が、どちらもまっとうな使いかたのような気がしますが。

上の例で ; をコマンドの区切りに使うというのはちょっとイレギュ
ラーだから拡張された sed だとだめかも知れませんが、sed って
知らないコマンドがきたら改行と同じように区切り文字だと思って
くれるってのは昔っからの仕様だったような気がしますので、大抵
はうまくいくと思います。

-e は一行で記述するときに改行みたいな役割をするための昔っか
らあるオプションだからこちらも問題ないかと。

ブロック化の { も昔っからあると思いますし。

環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
知ってたら教えてください。
--
01/31 02:14頃
水戸

SAITOH akinori

未読、
2004/01/28 16:46:062004/01/28
To:
大阪大学の齊藤です

Mito wrote:

> shi...@unixusers.net (Takashi SHIRAI) writes:
>
> sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i

>> sed の実装により文法が微妙に異なるので、このうちどちらが有
>>効かは環境依存ですが、場合によってはどちらも通らないかも知れ
>>ません。
> そうなんですか?

そうかなぁ。。。
sedの実装というよりは、shellの quote周りの処理の違いのような。。。

どうせこんなコマンドをコマンドプロンプトから手で
打つわけはないので、
sed '/^include/{

y/'/"/
}' $i

だけ考えときゃいいような。

> 環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
> 知ってたら教えてください。

一度に与えることのできるコマンドの行数は実装によって違いますね。
大昔のは50行とかがmaxだったとおもう。

齊藤明紀 sai...@ist.osaka-u.ac.jp

Hiroshi Fujishima

未読、
2004/01/31 3:46:112004/01/31
To:
Mito <co_...@ybb.ne.jp> writes:

>>  普通の shell だと「'」を含むような文字列は "" で quote し
>> た方が記述し易いと思います。
>
> " で quote する場合、* も quote が必要なんで、

どの shell をお使いなのでしょうか?

--
Hiroshi Fujishima

Takashi SHIRAI

未読、
2004/01/31 6:17:572004/01/31
To:
 しらいです。

 Linux の台頭により、GNU の実装が de-facto standard となり
つつある今日この頃、古くからの UNIXer の方々にとっては暮らし
にくい時代になってきていたりはしないでしょうか。

In article <m3r7xh1...@kzin.dip.jp>, Mito <co_...@ybb.ne.jp> wrote:
>" で quote する場合、* も quote が必要なんで、

 また新しい shell 規格を実装した人が出てきましたか。


> sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
> sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i

 へ?「#include」への置換に成功したら「"」の置換は行なわな
いんですか?なんか命題と違うルールになっちゃってますけど。そ
れともまた新しい sed 規格でしょうか。
$ echo "include 'xxx'"|sed "s/^include /#include /;t;s/'/\"/g"
#include 'xxx'
$
 因みに、GNU sed では上記の結果になりますが、*BSD な sed だ
と「ラベルが未定義」なエラーになります。「t」の後ろに「;」は
使えないんでしょうね。


>と同じように、{ でブロック化して、
>
> sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i

 「{」の後ろには何も function を置けなかったと思うのですが、
これが通用する sed はどの sed でしょう?少なくとも、*BSD と
GNU の実装では失敗します。
 以下のように「;」で改行してやると、GNU の実装では成功しま
すが *BSD の実装では先と同様失敗しますね。


sed "/^include /{;s/^/#/;s/'/\"/g;}" $i >tmp/$i

>>  sed の実装により文法が微妙に異なるので、このうちどちらが有
>> 効かは環境依存ですが、場合によってはどちらも通らないかも知れ
>> ません。
>
>そうなんですか?
>
>そんなに色んな環境で sed をこねくりまわした経験はありません
>が、どちらもまっとうな使いかたのような気がしますが。

 -e が複数記述出来ない sed の実装があります。古い BSD がそ
うだったかな。
 また、「/regexp/func1;func2」が「{/regexp/func1};{func2}」
と解釈される実装と、「/regexp/{func1;func2}」と解釈される実
装とがあるようです。
 bug なのかも知れませんけど、man page で記述されていないよ
うな些末な点では、実装により仕様の揺れが幾つか観測されていま
す。


>環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
>知ってたら教えてください。

 以前、Ancient UNIX の source を片っ端から紐解いて比較した
ことがあるんですが、あれをもう一度やるのは大変なので、興味が
おありでしたらご自分で挑戦してみて下さい。
http://www.tuhs.org/archive_sites.html

# 全部展開すると数 GB になるのでとっとと削除しちゃいました。
#全部 download して展開するだけでも一日仕事なので二度とやる
#気がしません :-)
# どっかで CVS 化して CVSweb か何かで公開してくれると便利
#なんですけどねー。

--
しらい たかし

IIJIMA Hiromitsu

未読、
2004/01/31 7:06:352004/01/31
To:
いいじまです。

>  以前、Ancient UNIX の source を片っ端から紐解いて比較した
> ことがあるんですが、あれをもう一度やるのは大変なので、興味が
> おありでしたらご自分で挑戦してみて下さい。
> http://www.tuhs.org/archive_sites.html
>
> # 全部展開すると数 GB になるのでとっとと削除しちゃいました。
> #全部 download して展開するだけでも一日仕事なので二度とやる
> #気がしません :-)
> # どっかで CVS 化して CVSweb か何かで公開してくれると便利
> #なんですけどねー。

「たったの」数 GB なら、DVD-R ドライブ持ってる人間つかまえて、昼飯をおご
って焼かせれば…

========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp

Mito

未読、
2004/01/31 8:48:172004/01/31
To:
shi...@unixusers.net (Takashi SHIRAI) writes:

> >" で quote する場合、* も quote が必要なんで、
>
>  また新しい shell 規格を実装した人が出てきましたか。

Fujishima さんにも指摘されてしまいましたが、なんかすっかり勘
違いしてしまったようで。^^;

> > sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
> > sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i
>
>  へ?「#include」への置換に成功したら「"」の置換は行なわな
> いんですか?なんか命題と違うルールになっちゃってますけど。そ
> れともまた新しい sed 規格でしょうか。

あれ?こっちも勘違いしちゃいましたかね?

「#include」への置換に成功したら「'」を「"」に変換して、失敗
したら変換しないってつもりなんですけど...

> $ echo "include 'xxx'"|sed "s/^include /#include /;t;s/'/\"/g"
> #include 'xxx'
> $
>  因みに、GNU sed では上記の結果になりますが、*BSD な sed だ
> と「ラベルが未定義」なエラーになります。「t」の後ろに「;」は
> 使えないんでしょうね。

あらま、ほんとだ。

そういやtの後は改行か -e 以外ではどうやってもだめだったよう
な気がしてきました。

ご指摘ありがとうございます。

> >と同じように、{ でブロック化して、
> >
> > sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i
>
>  「{」の後ろには何も function を置けなかったと思うのですが、
> これが通用する sed はどの sed でしょう?少なくとも、*BSD と
> GNU の実装では失敗します。

う~ん、ぼろぼろですねぇ。
やっぱりちゃんと実行して確認しないとだめですね...と思ったら

$ echo "include 'XXX'"|sed "/^include /{s/^/#/;s/'/\"/g}"
#include "XXX"

あれ、できちゃいました。^^;

$ sed --version
GNU sed version 4.0.5
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

FreeBSD のほうはやっぱりだめでした。

$ ident /usr/bin/sed
/usr/bin/sed:
$FreeBSD: src/usr.bin/sed/compile.c,v 1.13.2.3 2001/11/29 05:22:44 mikeh Exp $
$FreeBSD: src/usr.bin/sed/main.c,v 1.9.2.4 2001/11/29 05:22:44 mikeh Exp $
$FreeBSD: src/usr.bin/sed/misc.c,v 1.3.2.1 2001/11/29 05:22:44 mikeh Exp $
$FreeBSD: src/usr.bin/sed/process.c,v 1.10.2.1 2001/11/29 05:22:44 mikeh Exp $

sed では最後 } が「s/'/\"/g」の g と同様に s のフラグと勘違
いされるらしく、

$ echo "include 'XXX'"|sed "/^include /{s/^/#/;s/'/\"/g}"
sed: 1: "/^include /{s/^/#/;s/'/ ...": bad flag in substitute command: '}'

となりましたが、最後を「/g;}"」にすると動きました。

「{ の後に...」ってのは関係ないみたいですね。

>  -e が複数記述出来ない sed の実装があります。古い BSD がそ
> うだったかな。

ほんとですか! -e って改行の代わりに存在するようなオプション
だと思っていたのですが、そんなのがあったんですか。なんのため
のオプションだったのでしょうかね?

>  また、「/regexp/func1;func2」が「{/regexp/func1};{func2}」
> と解釈される実装と、「/regexp/{func1;func2}」と解釈される実
> 装とがあるようです。

>  bug なのかも知れませんけど、man page で記述されていないよ
> うな些末な点では、実装により仕様の揺れが幾つか観測されていま
> す。

へぇ~へぇ~へぇ~...(over 90へぇ)。前者しか知りませんでした。

> >環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
> >知ってたら教えてください。
>
>  以前、Ancient UNIX の source を片っ端から紐解いて比較した
> ことがあるんですが、あれをもう一度やるのは大変なので、興味が
> おありでしたらご自分で挑戦してみて下さい。
> http://www.tuhs.org/archive_sites.html

いえ、そこまでするつもりはありません。
どうもありがとうございました。
--
01/31 22:48頃
水戸

Yukio Sakuma

未読、
2004/01/31 22:38:082004/01/31
To:
Shiino Masayoshi wrote:

> 数学の本なんか見ても、添字に i, j, k, ... を使う事が結構あります。
> 大体、定数には n, m 辺りを、変数として i, j, ...を使う様な気がしま

 概ね納得できるんですが、中学校の坂口先生は変数はx,y,z辺り、
定数はa,b,c辺りを慣例で使うんだよ。と仰っていました。

#それが何だと言われても…ただ思い出したんですよ。
---
佐久間 行雄

新着メール 0 件