重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんばんは。
Cシェルで1文字単位で置換する場合なのですが、

A→Y
B→"
C→3
D→~
のように対応しているファイルを読み込んで合致したらその文字に置換という方法にしています。その場合、D→~なので、ホームディレクトリが格納されてしまいます。

例えば、「ADC」という文字列があったら、「Y~3」というように置換したいのですが、「Y***/###3」のようになってしまいます。置換の際はechoとsedを使って、一度ファイルに落とし、それをまた変数に格納しています。
また、{や0もうまく読み込んでくれませんでした。クォーテーションでくくるとクォーテーションごと格納されました。("~" or '~')
ファイルの方に\をつけて、\~でもうまくいきませんでした。
なんだか支離滅裂な文章ですが、ご存知の方いらっしゃいましたらどうぞ宜しくお願いします。

A 回答 (3件)

ぐはっ, 自分の馬鹿さ加減に頭痛が....


sed の -f オプションを忘れてた... orz
実際には sed は「隠れた制限」があるときもあるんだけど, 制限にひっかからないならこうした方がいいかな:
まず, 次の行を csv2pat.pat という名前のファイルに保存します:
s,[]^[*+?./\\&],\\&,g; s#^#s/#; s#,#/#; s#$#/g#
でもって, 次のように実行します:
sed -f csv2pat.pat ~/work/Book1.csv > ~/work/Book1.pat
sed -f ~/work/Book1.pat あれ > それ
終わり.
とりあえず
> echo $chg_word | sed -e s/$before/$after/ >work/moji.txt
> set Cnv_lit = `cat ~/work/moji.txt
> set Cnv_file = $Cnv_file$Cnv_lit
の 3行で何をしたいのかわかりませんけど...
    • good
    • 0
この回答へのお礼

お礼遅くなりまして申し訳ありません。

sedのfオプションで置換ファイルを書き換えるんですね!
とりあえず
> echo $chg_word | sed -e s/$before/$after/ >work/moji.txt
> set Cnv_lit = `cat ~/work/moji.txt
> set Cnv_file = $Cnv_file$Cnv_lit
の 3行で何をしたいのかわかりませんけど.
sedで置き換えたものを一旦テキストに落として(1)、テキストから変数に入れなおして(2)、一字ずつバラした文字列をくっつける(3)というようにしていましたが、もうちょっとやり方自体を考えてみようと思います。
ご回答ありがとうございました。

お礼日時:2007/09/28 20:01

とりあえず動作させるだけなら必要に応じて


set noglob

unset noglob
を使えばいいと思うけど....
なんというか, 「awk で必要な処理をテンポラリファイルに書き出して, それを sed に与える」方が (可能なら) 見通しがいいような気がするのはなぜだろう....
もっと可能なら Perl で処理しちゃう.
    • good
    • 0

????


sed でできるような気がするんですけど....
どのように実行しようとして期待通りにいかなかったんでしょうか?
    • good
    • 0
この回答へのお礼

早々のご回答有難うございます。

置換元:EABC
変換用ファイル(Book1.csv)
A,Y
B,"
C,3
D,~
E,8
想定置換後:8Y"~
としたいのですが、「8Y"****/****(ホームディレクトリのパス)」になってしまいます。

スクリプトは以下のようにしています。
#変換リスト読み込み
set filename1 = ~/work/Book1.csv
set file_cnt = `cat $filename1 | wc -l`

#置換
@ line = 1
whie($file_cnt >= $line)
set file_word = `cat $filename1 | head -n $line | tail -n 1`
set before = `echo $file_word | awk -F, '{print $1}'`
set after = `echo $file_word | awk -F,'{print $2}'`

echo $chg_word | sed -e s/$before/$after/ >work/moji.txt
set Cnv_lit = `cat ~/work/moji.txt
set Cnv_file = $Cnv_file$Cnv_lit

moji.txtには~のみなので、変数に格納しようとすると自動的にホームディレクトリになってしまう??ようなのです。

このsedの使い方で出来ますか?

お礼日時:2007/09/19 21:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!