• 締切済み

sedスクリプト 置換

この度、はじめてsedスクリプトをかいてみようと思っています。 以下の機能を持った置換スクリプトを書きたいのですが、 アドバイスなど頂ければ幸いです。 ・abcディレクトリ内を検索して(サブディレクトリも含む)、test.txtというファイルを探し出す(test.txtは複数あります) ・検索された複数のtext.txtを一括で置換する ↓置換内容 ・test.txtの5行目にある文字列を1からはじまる連番に置換する(test.txtは複数あるので、処理した順に連番をつけていく) イメージが伝わりにくい場合は、どうかご指摘ください。 よろしくお願いします

みんなの回答

  • P-mann
  • ベストアンサー率62% (56/89)
回答No.1

sedスクリプトというのは、sedを利用するシェルスクリプト のことでしょうか? そういう前提でアドバイスします。 ・test.txtはfindで探し、それぞれをforで処理。 ・処理した順番の連番は適当な変数をインクリメント。  exprコマンドを使うといいでしょう。 ・5行目の置換はsedのmanを見れば明らかでしょう。  5行目だけを置換するのであれば、5行目を指定して置換コマンドを  実行すればいいだけです。 ・一時ファイルを作ってから元のファイルに上書きしましょう。  でないと、中身が空のファイルが出来上がります。 アドバイスを、とのことですので一切答えは書きません。 どうぞ考えてみてください。

関連するQ&A

  • 複数パターンのsed文についての質問です。

    sedの使い方がよく分からない為、教えてください。 テキストの中で、同じパターンスペースに対して、 別の文字を置換させたいと考えています。 (一つ目のマッチングには、yyy 二つ目には、zzzなど) sed文ではコマンドブロックの書き方がわからないので、 sedスクリプトを別に用意してファイルを読み込ませた所、 うまくいきました。 sed -f test.sed test.txt しかし、第二段階として、置換文字列を変数にしたところ、 変数展開ができませんでした。実際には変数展開を考えているので、 困っているところです。 この問題を解決できるようなsed文(sed -e)か、sedスクリプトを 教えて頂きたく宜しくお願いいたします。 下記、テスト材料です。 一つ目のabcを $HOMEに、 二つ目のabcを $SHELLに置き換えたいです。 text.txt (編集元テキスト) ------------------ User yyyyy abc Pass zzzzz abc ------------------- test.sed(SEDスクリプト) --------------------- /User/{ N N s/abc/$HOME/ N N N s/abc/$SHELL/ } ----------------------

  • sedでの置換がうまくできません。

    sedを使用して以下の様な文字列を置換したいと考えています。 iPar(\"w\") → 何かの文字列 そこで以下のようなsedスクリプトを作成しました。 s/iPar\(\"w\"\)/test/g  → a.sed 使用してみました。具体的には↓のコマンド >sed -f a.sed inputデータ >outputデータ しかし結果ファイルをみても何も変わってくれません。 なにが悪いのでしょうか? どなたかご指南下さい。

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

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

  • SEDの使い方

    こんにちは。 sedである複数行のパターンにマッチしたら置き換えるということをしたいのですが上手くいきません。 たとえば、 test.txt aaa bbb ccc に対して、 sed -i.bak s/aaa/aaa'\n'111/g test とすると、 test.txt aaa 111 bbb ccc となります。 これを戻す方法として、 sed -i.bak s/aaa'\n'111/aaa/g test としても、元に戻りません。 sedを用いで元に戻す方法をご教示いただけないでしょうか。 よろしくお願い致します。

  • SED スクリプトファイルを複数のファイルに作用させたい。

    SEDのスクリプトファイル(henkan.sed)を作りました。 このスクリプトを実行させたい対象ファイルが15個あります。(temp01.txt~temp15.txt) > sed -f henkan.sed temp01.txt > kekka01.txt > sed -f henkan.sed temp02.txt > kekka02.txt           ・           ・           ・ > sed -f henkan.sed temp15.txt > kekka15.txt これはあまりにもしんどいです。何かよい方法はあるでしょうか。 また、コマンドラインから一つのスクリプトファイルを複数の対象ファイルに作用させることは可能でしょうか。 よろしくお願いします。

  • cshのsed

    ヤマトです。 cshのsedについて質問します。 環境はRed Had Linux7.2です。 文字列置換でsedを使っています。 置換文字列に'/'が入ってしまう場合正常に動作しません。 原因は分かります。'/'が多いって事ですよね(曖昧な言い方ですみません) どのようにしたら、できるでしょうか? 以下に、サンプルを書きます。 ====SAMPLE.sh(一部抜粋)==== set DATA_DIR = /home/hoge set FILE_NAME = hoge.txt sed "s/__DIR__/$DATA_DIR/g" < FILE_NAME > FILE_NAME.sed ====hoge.txt==== 置換した ディレクトリは __DIR__/です ====hoge.txt.sed(作成したいファイル)==== 置換した ディレクトリは /home/hoge/です どのようにsedしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • sedコマンドについて

    123,456 234,567 345,678 456,789 というデータが入った111.txtを 456 123 567 243 678 345 789 456 と sedを使って1行で置換する方法を教えてください。

  • sedでカンマ区切りの列の置換を行いたい

    以下の様なファイルがあります。 sedコマンドを使用して、カンマで区切られたn番目のカラム目を 置換したい場合どうすればよいでしょうか。 "1","2","3","4","5","6" "1234","12","34567","abcd","efg","hi" "a c","d f","12 34","0","AAA","" "g i","j l","45 67","0","BBB","2021" "m o","p r","3 2 1","1","ABC","" "123","456","","abc","efg","hij" ①1カラム目以外置換(1カラム目以降削除) sed 's/\(.*\),.*,.*,.*,.*,.*/\1/g' test.csv ②最後の6カラム目以外置換(6カラム目以外削除) sed 's/.*,.*,.*,.*,.*,\(.*\)/\1/g' test.csv ③3カラム目を置換(3カラム目を「""」だけにしたい) sed -e 's/\(.*\),\(.*\),.*,\(.*\),\(.*\),\(.*\)/\1,\2,"",\3,\4,\5/g' test.csv とできたのですが、 表現がないというか、置換対象文字列の条件、表現が長いというか、全カラムを指定しているので、 少し、短くできないものでしょうか。 ①パターン sed 's/\([^,]*\),.*/\1/g' test.csv ②パターン sed "s/.*,\([^,]*\)$/\1/g" test.csv の様にできました。 ③パターン 思いう浮かばず これで、できているので間違いはないかとおもいますが、 どうなのでしょうか。 なにかいい案はないでしょうか?

  • sedでの複数行にまたがる文字列置換

    スクリプト初心者ながら、少しずつ前進してきました。 特定のサブディレクトリ配下にあるファイルの文字列についてsedコマンドを使って置換しようと思っています。 条件が複数あるため、条件を外出しにして実行しているのですが、複数行またいだ場合の置換方法がわかりません。 例)  /path1/path2/itemname を  /aaa/bbb/itemname  に置換したい。 上記の場合、条件ファイルに s|/path1/path2/itemname|/aaa/bbb/itemname|g で大丈夫だと思うのですが、 /path1/path2/itemname が /path1/path2/ itemname だったり /path1/path2/ itemname だったりと、改行や空行が入って置換対象の文字列が複数行をまたいでいる場合があります。 /\/path1\/path2\//{ N s|/path1/path2/\nitemname|/aaa/bbb/itemname|g } とやってみたら /path1/path2/ itemname だけはうまくいきました。 上の内容は1ファイル中に、複数存在しています。 アドバイスをお願いいたします。

  • 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は、文字列が格納されているファイル。 よろしくお願いいたします。