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

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

【シェル】チルダの置換

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

  • rami-
  • お礼率54% (20/37)

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

  • ベストアンサー
  • 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

  • sedの置換文字に変数を使用したいのですが・・・

    あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。 例: X="a" Y="b" echo test.txt | sed 's/${X}/${Y/g}' >test.txt sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • シェルで文字列を置換したい。

    UNIXのシェルであるファイルに書かれている文字から ある文字列を置換してそのファイルの中身を書き換えたいのですが どう書いていいのかわかりません。 ファイルを読み込んで該当の文字列を含んだ行を 見つけるところまではいったのですが・・・。 どなたか教えてください! よろしくお願いします。

  • cshの文字列置換

    ヤマトです。 cshでファイル文字列を置換したいのですが、分かりません。 環境はRed Had Linux7.2です。 hoge1.txt の中の 'HIDUKE' という文字列を今日の日付に置換し、 hoge2.txt に出力するようなシェルを作りましたが、正常に動作しません。 ====hoge1.txt(置換前)==== 今日はHIDUKEです。 ====hoge1.txt(置換前)==== 今日は030814です。 ====SAMPLE.sh(一部抜粋)==== set TODAY = `date +"%y%m%d"` sed 's/HIDUKE/$TODAY/g' < hoge1.txt > hoge2.txt 以上のようなシェルを作りました。 結果として、hoge2.txtには出力されるのですが、 「今日は$TODAYです」 となってしまいます。 変数の値を置換するにはどのようにしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • UNIX のシェル 文字の置換について

    シェルでファイルの文字列を置換したいです。 /*~*/のコメントの文字なので、1行数を変えたくないです。 ─────────────────────────── ※1文字分の空白を「_」で表示します。 test.txtファイルの「XXXXX」を「aa___」に置換する。 ─────────────────────────── 【test.txt 置換前】 /**************/ /*_XXXXXYYYYY_*/ /**************/ 【シェルの内容 test.sh】 #!/bin/csh set IN_henkan = `printf "%-5s" $1` perl -i -p -e 's/XXX/'$IN_henkan'/g' test.txt 【シェルを実行】 test.sh aa 【test.txt置換前 希望する状態】 /**************/ /*_aa___YYYYY_*/ /**************/ 【test.txt置換前 実際の状態】 /**************/ /*_aa_YYYYY_*/ /**************/ ─────────────────────────── 「aa」の後ろに1文字分の空白しか挿入されないです。

  • sedでダブルコーテーションを違う文字に置換

    お世話になります。 csvファイル内にある"""(ダブルコーテーション3つ連続)を"~(ダブルコーテーション+チルダ)に置換 したいのですが、どのように記述すればいいのでしょうか? Windows7上でGNU32のsed.exeを使用しています。

  • ブランクを含む環境変数の置換

    こんにちは。 今、UNIX上でファイルのある文字をある環境変数で置換するようなシェルを作成中です。 そこで、以下のようにsedを使用してみました。 cat AAA.txt |sed s/CurFY/`echo $FY`/g AAA.txtの内容 AAA BBB CurFY この時、環境変数$FYがブランクを含まない値の場合 はうまくCurFYを$FYの値に変更できるのですが、$FYに ブランクが入っていた場合は実行できません。 実行例) setenv FY "ACT 2003" cat AAA.txt |sed s/CurFY/`echo $FY`/g sed: コマンドが正しくありません: s/CurFY/ACT となってしまいます。 何かうまい方法はないでしょうか? どうかアドバイスお願いいたします。

  • sambaで連携したファイルをLinuxからsedでの置換

    お世話になります。 sedを使って文字列の置換をしたいと考えています。 sambaでwindowsから連携したファイルに対して置換を行いたいのですが、うまく置換ができません。 Linux側の「GNOME端末」からファイルの中身をのぞくと、全角の箇所が文字化けしてしまっていました。どうやら原因はこれだと思うのですが、どうすれば文字化けしていてもうまく置換できるでしょうか? あるいはLinux側から見ても文字が化けないようにするにはどうすればよいでしょうか? 例)   test[Tab]2008年5月05日[Tab]あああ[Tab]aaaaa という文字列に対し、 sed -e 's/^.*\t.\(.*\)\t.*\t.*$/3\1/' test.txt というコマンドを実行したが、うまく置換されない。 ※test.txtは、文字列が格納されているファイル。 よろしくお願いいたします。

  • UNIXのシェルスクリプト

    UNIXのシェルスクリプトで以下のようなことをやりたいのですがいい方法を教えて下さい。 ファイルの中にある文字列があります。 たとえば”CURREND_DIR” この文字列をシェルスクリプトでカレントのディレクトリパスに変換したいのですが いい方法が思いつきません。 set dir_data = ‘pwd‘ sed -e ’s/CURRENT_DIR/$dir_data’ ファイル名 でできるかなと思ったのですが、”CURRENT_DIR”が”$dir_data”に置換されてしまいます。 さらにdirパスが”/”で区切られていることも問題のようです。