• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【シェル】チルダの置換)

シェルでのチルダの置換について

このQ&Aのポイント
  • Cシェルでの文字単位の置換方法について質問です。特定の文字に対応した置換処理を行いたい場合、どのような方法がありますか?また、ホームディレクトリの置換に注意が必要な場合は何に気を付ければ良いでしょうか。
  • 現在、Cシェルで特定の文字に対して置換処理を行いたいと考えています。具体的には、AをYに、Bを"に、Cを3に、Dを~に置換したいと思っています。しかし、Dを~に置換するとホームディレクトリが格納されてしまう問題が発生しています。この問題を解決するためにはどのような方法がありますか?
  • Cシェルで文字の置換処理を行いたい場合、echoとsedを使用してファイルに一度落とし、それを変数に格納する方法を使っています。しかし、特定の文字({や0など)が正しく読み込まれない問題があります。また、ホームディレクトリの置換についても問題があります。上記の問題を解決するためにはどのような方法がありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.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行で何をしたいのかわかりませんけど...

rami-
質問者

お礼

お礼遅くなりまして申し訳ありません。 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)というようにしていましたが、もうちょっとやり方自体を考えてみようと思います。 ご回答ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

???? sed でできるような気がするんですけど.... どのように実行しようとして期待通りにいかなかったんでしょうか?

rami-
質問者

お礼

早々のご回答有難うございます。 置換元: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の使い方で出来ますか?

関連するQ&A