• ベストアンサー
  • 暇なときにでも

同じ名前のファイルにリダイレクト

あるファイルを処理し、そのファイルにそのままリダイレクトして書き出そうとした場合の処理に関してです。 例) sed 's/aaa/bbb/' hoge.txt > hoge.txt このようにするとhoge.txtの中身が消えてしまいます。 別名のファイルに書き出してmvすればよいのですが、なぜできないのか納得ができず悩んでいます。 お分かりの方いらっしゃればお教えください。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数2809
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.3

No1 の方が書いているとおり、Linuxに限らず、UNIX系OSで(少なくともcsh系では)リダイレクトによって出力をファイルに落とそうとすると、出力先のファイルがまず作られてからコマンドが実行されます。 このとき、既存のファイルと同じ名前のファイルを出力先に指定すると、強制的に空ファイルによって上書きされます。 (なんでそういう設計になっているかは知りません) ちなみにMS-DOS(試してないけどたぶんWin2k以上のコマンドプロンプトも)では、リダイレクトの際はまずテンポラリファイルに出力されてからリダイレクト先のファイルにコピーされるため、質問文のような記述をしても問題なく実行結果が出力されます。

共感・感謝の気持ちを伝えよう!

質問者からの補足

詳しい説明ありがとうございました。

関連するQ&A

  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • 301リダイレクトの記述方法に関して

    サイトリニューアル後の301リダイレクトに関してご質問させて頂きます。 旧サイト URL : http://www.hoge.co.jp/aaa サーバーのディレクトリ : www/aaa 新サイト(全ページssl対応) URL : https://www.hoge.co.jp/aaa/bbb サーバーのディレクトリ : ssl/aaa/bbb サーバー:ファーストサーバ ------------------------------------------------------------------------- 上記の状況で旧サイトのディレクトリwww/aaaより下のファイルにアクセスしてきたものを 全て新サイトのトップページ(https://www.hoge.co.jp/aaa/bbb/index.php)へ 「.htaccess」を使用してリダイレクトしたいのですが、どの様に記述すれば良いのか 分かりません。 調べて「.htaccess」を作成しサーバーへアップロードしてみてもインターネットエラー500に なってしまいます。 この様な場合の「.htaccess」の記述方法や設置場所をご教授頂きますようお願い申し上げます。

  • テキストファイルの一部置換したファイルをたくさん作りたい

    テキストファイル(a.txt)があるのですが このファイルの一部の文字列aaaをbbbに置換したファイル(b.txt)を作りたいです。 また文字列aaaをcccに置換したファイル(c.txt)も作りたいです。 続けてd.txtやe.txt・・・と作っていきたいですが簡単にできるフリーソフトはないでしょうか? 現状はa.txtを開いてaaaをbbbに置換して、別名で保存するのを繰り返し(10回以上)するので大変です。 このようなことが楽にできるフリーソフトがあれば教えてください。

その他の回答 (2)

  • 回答No.2
  • asfd
  • ベストアンサー率21% (25/117)

シェルの仕様です。既存のファイルをリダイレクト先に選ぶと、 ファイルサイズを0にします。その後、sedが実行されます。 なぜ、こんな仕様になっているのかは分かりませんが、この仕様のが 分かりやすいのは確かかと、、

共感・感謝の気持ちを伝えよう!

質問者からのお礼

そういう仕様なんですね。 納得しました。

  • 回答No.1
  • gatyan
  • ベストアンサー率41% (160/385)

sedが実行される前に、シェルによってhoge,txtがoutputモードでオープンされるからです た ぶ ん

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご解答ありがとうございます。

関連するQ&A

  • Windowsから直接起動するアプリにリダイレクトを設定するには?

    Windowsから直接起動するアプリにリダイレクトを設定するには? 「ファイル名を指定して実行」から直接アプリを起動し、それにリダイレクトを設定したいのですが、指定したファイルに出力されずに困っています。 例.「ファイル名を指定して実行」→「ipconfig > c:\hoge.txt」を入力= コンソールに出力 コマンドプロンプト上から「ipconfig > c:\hoge.txt」を実行するとhoge.txtに出力されるので、もしかしたらリダイレクト機能はWindowsではなく、コマンドプロンプトが持ってる?と疑っています。 だとしたら、Windowsから直接アプリを起動する場合、リダイレクトは設定できないことになりますが、この認識であっているでしょうか? 環境:Windows XP

  • .htaccessを使用したリダイレクトの書き方

    .htaccessを使った301リダイレクトの書き方を教えてください。 ドメインは移転後も同じものを使用し、下記のようにリダイレクトしたいと考えています。 /bbb/を http://www.aaa.com/blog/bbb/ にリダイレクト。 /bbb/ddd.htmlを http://www.aaa.com/shop/ddd/ にリダイレクト。 ------------------- Redirect permanent  /bbb/ http://www.aaa.com/blog/bbb/ Redirect permanent  /bbb/ddd.html http://www.aaa.com/shop/ddd/ ------------------- こう書いてしまうと、1行目は正常にリダイレクトされるのですが、 2行目が http://www.aaa.com/blog/bbb/shop/ddd/ にリダイレクトされて しまいます。 このような場合、どのように記述さればよろしいのでしょうか?

  • 外部パラメータを使用したファイルの作成・書き込み

    テキストファイルに以下の内容が書かれています。 ファイルパス:/aaa/bbb/ccc ファイル名:ファイル.txt これを読み込んで $filepath = /aaa/bbb/ccc $filename = ファイル.txt となっています。 この時(「ファイル.txt」は存在しません。)、以下のような処理を行うと「/aaa/bbb/ccc」ではなく、「/aaa/bbb」に「ファイル.txt」が作成されるのですが、なぜでしょうか?? open(TXT, ">> $filepath/$filename"); flock(TXT, 2); print TXT $header; flock(TXT, 8); close(TXT); この処理の前に$filepathの値を調べましたが、確かに「/aaa/bbb/ccc」となっています。 何か注意する点や、ここが問題では?と言うようなことがあれば教えてください。

    • ベストアンサー
    • Perl
  • sedでの変更をファイルに反映させる

    aaa.txtというファイルの中身が Welcome China だったとして、これをWelcome Indiaに変更したファイルを生成したい場合、 sed s/China/India aaa.txt > bbb.txt でよいかと思うのですが、aaa.txtの中身を直接変更したい場合、 sed s/China/India aaa.txt > aaa.txt としてしまうと、aaa.txtの中身が空っぽになってしまいます。エディタで開いて、置き換えをすればよいのですが、エディタを使わないで、ファイルの中にある単語の置き換えをし、ファイルに直接反映させる方法はないでしょうか。  できればsedを使った方法で、知りたかったのですが・・。

  • shellの文法 deffとdo while ??

    最終目標はaaa.c(aaa.txtの中身)とaaa_x.c(bbb.txt)、bbb.cとbbb_x.cのdiffをとり、差分をtxtファイルに出力したいと思っています。 ファイル名の規則は1パターンのみで、_xの前の部分が同じもの通しがdiffをとる対象になります。 (パスはすべてばらばらです) aaa.txtの中身 ファイルパス/ファイル名 a/b/c/aaa.c aa/bb/cc/bbb.c . . . bbb.txtの中身 ファイルパス/ファイル名 x/y/z/aaa_x.c xx/yy/zz/bbb_x.c . . . 考えている処理は (1)aaa.txtからファイル名を抜き出す(basename ?) →結果を変数(AAA)に代入 (2)抜き出したファイル名に_xを追加(.を_x.に置き換え)した変数(BBB)でbbb.txtを検索 (3)変数AAAとBBBのdiffをとる>>txtファイルに出力する shellをうまくつかいこなせず、すみませんが教えていただければと思います。

  • awkの入力ファイルをリダイレクト先にする方法

    ---------hoge.txt--------- hoge hoge hoge ------------------------- 等としておいて、 $ awk '{print NR":"$1;}' hoge.txt とすると標準出力に ------------------------- 1:hoge 2:hoge 3:hoge ------------------------- と表示されますが、これを $ awk '{print NR":"$1;}' hoge.txt > hoge.txt と自分自身にリダイレクトするとhoge.txtは空になってしまいます。 hoge.txtに上の標準出力を上書きするにはどのように書けば良いのでしょうか、教えてください。 awkだけでなく、テキストファイルを入力にできるコマンド一般についても 上記のようなことができる方法があれば、教えていただきたいです。

  • .htaccessリダイレクト

    .htaccessリダイレクト 別ドメインにリダイレクトさせるための方法が分からないので、質問させてください。 現在http://www.aaaaa.jp/aaa/bld_list.phpにアクセスしたときに http://www.bbbbb.jp/bbbにリダイレクトさせようとしています。 googleで「別ドメイン .htaccess リダイレクト」など色々検索してみたのですが、 なかなか出て来なく、困っています。 どなたかアドバイスいただけないでしょうか?

  • 指定フォルダ配下のファイルを個別圧縮するバッチファイルの作成

    下記の処理を行うバッチファイルは作れないでしょうか? 1.バッチファイルにフォルダをドラッグ&ドロップ 2.ドラッグ&ドロップしたフォルダ配下のファイルを全て個別圧縮する (例.C:\AAAをドラッグ&ドロップした場合) フォルダAAA | ・111.txt | LフォルダBBB | ・222.txt | ・333.txt | LフォルダCCC | ・444.txt | LフォルダDDD ・555.txt ↓ フォルダAAA | ・111.zip | LフォルダBBB | ・222.zip | ・333.zip | LフォルダCCC | ・444.zip | LフォルダDDD ・555.zip

  • リダイレクトについて

    phpプログラム内において、 ファイル出力はどのように行うのでしょうか? 例: <?php echo aaa > bbb.log ?> よろしくお願いします。

    • ベストアンサー
    • PHP
  • パラメーター付きのURLをリダイレクトしたい

    お世話になります .htaccess でリダイレクトを行いたいのですが、パラメータ付きのURLの為かリダイレクトができません。 .htaccess内の記述↓ redirect 301 /aaa/bbb.php?N=1 http://www.aaa.com/index.html 「?=N1」の部分を取れば問題なくリダイレクトします パラメータ付きのURLはリダイレクト可能でしょうか? よろしくお願いいたします