• ベストアンサー

中継ファイルを用いないで、テキストファイルを書き換える方法ってあるの?

RedHat9でbash等を使用してます。 /home/user01/hoge.txtを加工したいのですが $ perl -npe 's/^\s//' /home/user01/hoge.txt > /home/user01/hoge.txt としたら、/home/user01/hoge.txtが空ファイルになってしまいました。 中継ファイルを用いないで行う方法は有りませんでしょうか?

  • KaoriM
  • お礼率86% (153/177)

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

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

-iオプションではいかがでしょうか?

参考URL:
http://www.stackasterisk.jp/tech/program/perl04_04.jsp
KaoriM
質問者

お礼

$ perl -i -npe 's/^\s//' /home/user01/hoge.txt として上手くいきました。 どうも有り難うございました。

その他の回答 (1)

回答No.1

/home/user01/hoge.txt > /home/user01/hoge01.txt とか名前変えたらどうですか? 私はnkfでファイルの中身がなくなった経験があります。

KaoriM
質問者

お礼

$ perl -i -npe 's/^\s//' /home/user01/hoge.txt として上手くいきました。 どうも有り難うございました。

関連するQ&A

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • find で探したファイルを探した階層の一つ上へ移動したい

    findコマンドで、深い階層にあるファイルを一階層上へ移動するfindコマンド記述方法を探しています。 /home/user1/text/2007/01/06/text/aaa.txt を /home/user1/text/2007/01/06/aaa.txt へ移動するのが目的です。 ファイルの格納状況は、 /home/user1/text/[1983-2007]/[01-12]/[01-31]/text/ という構造のディレクトリに*.txtが格納されています。 suse10.0, bashです。よろしくお願いいたします。

  • 親ディレクトリの更新日付を更新せずにファイルを削除するには

    親ディレクトリの更新日付を更新せずにファイルを削除するには 例えば、以下のディレクトリ構成で「aaa.txt」を削除しても親ディレクトリである「AAA」の更新日付が変更されない方法はありますでしょうか? なお、実装はRHEL5上でのBashスクリプトになります。 /home/hoge/AAA/ => 2010/10/01 06:30:00 /home/hoge/AAA/aaa.txt => 2010/10/01 06:30:00 2010/10/03 12:30:00に以下のコマンドを発行 rm /home/hoge/AAA/aaa.txt /home/hoge/AAA/ => 2010/10/03 12:30:00 に更新されてしまいます。 => 2010/10/01 06:30:00 を保持していたいのです。 できればコマンドのみで解決したいと思っています。 コマンド単体で無理なら、rmで削除する前にディレクトリ情報を一時ファイルへ書き出すしかないと思っています。 以上、よろしくお願いします。

  • 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だけでなく、テキストファイルを入力にできるコマンド一般についても 上記のようなことができる方法があれば、教えていただきたいです。

  • textファイルのgdbm化

    RedHat Linux7.2上でPerlを使用しています。テキストファイルをGDBMファイルに変換するにはどの様にしたらよろしいのでしょうか。最低限投入されるべきソフトと投入されているか否か確認する方法がありましたら、教えてください。

    • ベストアンサー
    • Perl
  • awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか

    awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか。 ファイル(hoge.txt)の内容は、次の通り(全4行) 123 456 50 20 これを、bashスクリプトで計算させます。 FF=`cat hoge.txt | awk 'BEGIN {x=$2;printf ("%s, %s", (148+x*0.05), x);}'` echo "答え = ${FF}" このときの$2の値は、50です。但し、文字列として扱われているようです。 xの値を、数値として代入され、四則演算をさせるにはどうしたら良いですか? 以上、よろしくお願いします。

  • linuxで隠しファイルの移動について

    [/home/user1/] があります。 この中は雑然としていますが、これを整理する為、一旦全て移動させようと思っています。 [/home/user1/wk1/]を作成し [/home/user1/]を[/home/user1/wk1/]に移動します。 この時、[/home/user1/]内には[.bash_history]等の隠しファイルがあり、これらはそのまま[/home/user1/]に残して、 隠しファイル以外のファイルやディレクトリを全て[/home/user1/wk1/]に移動したいのですが、最も手間の掛からない方法を教えて頂きたいです。 <変更前> /home/user1/ +-.bash_history +-.lang   +-langrc.csh +-file1 +-dir1/   +-d1_1/   +-d1_2/     +-file1 <変更後> /home/user1/ +-.bash_history +-.lang   +-langrc.csh +-wk1/   +-file1   +-dir1/     +-d1_1/     +-d1_2/       +-file1 同一ディレクトリの下位に移動するというのと、隠しファイがいるという事が結構面倒な要因になっていますが、いい方法がないでしょうか? ・指定したデイレクトリ内の隠しファイルだけすべて再帰的に移動 ・指定したデイレクトリ内の隠しファイル以外すべて再帰的に移動 このどちらかが出来れば簡単なのかもしれませんが。。

  • Perl:あるファイル名が指定のリスト(テキストファイル)になければ、そのファイルを消去するというのを作りたいのですが。

    RHL9.0を使ってます。/var/spool/mail/以下に次のようなファイルがあったとします。 taro hanako daisuke yukie また、/home/admin/user-name.txtというファイルには次のように書かれています。 taro hanako … このとき、perlを用いて/var/spool/mailディレクトリからuser-name.txtに名前のない人のファイルを消去するというスクリプトを作りたいのですが。おそらくif 文を使うと思うのですがどうすればよいでしょう。$userという変数にuser-name.txtの一つ一つを代入してWhile文でまわすことはできてます。後は「$userという名前のファイルが/var/spool/mail以下になかったらsystem("rm /var/spool/mail/$user");を実行する。」とするだけです。 ちなみに、userdelを-rコマンドをつけずに消去された人たちのものが実際存在する人たちのものと混在しているため消したいと言うのが動機です。

  • Unix初心者による初心者シェルプログラミングです。

    Unix初心者による初心者シェルプログラミングです。 以下のようなコマンドを羅列しただけの スクリプトが300行(実質100行ぐらい)が漸くできるようになりました。 これだけで、おばかさんな私は進化してます。が・・・ 対象となる、hoge.txtは、同ディレクトリ内に別名で、200ファイル有ります。 このスクリプトがその別名、200ファイルへと対象になります。 と云う事はファイル名分の200ファイル分スクリプトを編集して用意しなくては いけなくなる。 となると・・・ 別の事をしないといけませんよね。 どうやら、同ディレクトリ内にある、全ての .txt ファイルに対してこの スクリプトを実行させるには・・・ (よくわかりませんが・・・) FILE=`/home/foo/*.txt` みたいな・・・(全然違うと思っていますが、イメージで) /home/foo/ 内の .txt ファイルを一ファイルずつ読み込んで、実行させる方法が あると思うのですが・・・ 全てを教えて貰うつもりはありません。 学習していきます。 でも、疲れてきました。 がしかし、やらなくちゃいけません。 ヒント下さい。 お願いします! > cat hogehoge.sh #!/usr/bin/sh DAY=`/usr/xpg4/bin/date '+%Y/%m/%d%a'` HUMAN=`/usr/ucb/whoami` TIME=`/usr/xpg4/bin/date '+%H:%M:%S'` echo echo "$DAY : $HUMAN : PID $$" echo echo "$0" echo echo "$TIME Let's start!" echo echo "ls -l /home/foo/hoge.txt" ls -l /home/foo/hoge.txt echo echo "cat -n /home/foo/hoge.txt | head -15" cat -n /home/foo/hoge.txt | head -15 echo echo "sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt" sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo echo "cat -n /home/foo/new-hoge.txt | head -18" cat -n /home/foo/new-hoge.txt | head -18 echo echo "sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt" sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt echo echo "ls -l /home/foo/renewal-hoge.txt" ls -l /home/foo/renewal-hoge.txt echo echo "diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt" diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt echo echo "sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt" sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo ・ ・ ・ ・ ・ ・ ・ ・ 300

  • あるファイルと同じファイル名のファイルをbashで生成

    OSはLinuxです。 あるディレクトリAにhoge_i(i=1~100)というファイルがあったとします。 別のディレクトリBに、同名のファイル100個を作りたいのですが、 どのようにすればよいでしょうか。 なお、新ファイルの中身は空でもかまいせん。 タイトルではbashと書きましたが、awkでもかまいません。