• ベストアンサー

シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

こんにちは。 シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。 ・sample.txt (挿入前) -- <ABC> <ABC> Hello! </ABC> </ABC> -- ↓ ・sample.txt (挿入後) -- <ABC> <ABC> Hello! </ABC> Good Morning Good Evening </ABC> -- 上記のように、テキスト末尾から検索して、 はじめて表れた"</ABC>"のタグの前に、 Good Morning Good Evening という2行の文字列(無理なら1行でも)を追加したいと考えています。 "</ABC>"タグは2つありますが、末尾から検索して初めて表れたもののみ対象です。 このような操作を行うには、 どのようにシェルを組み合わせれば良いのでしょうか? grepやsedを用いて考えてはいますが、よく分かりません。 (grepで末尾から初めて表れた"</ABC>"の行番号を取得し、 その上に、sedで文字列を挿入するなどですが・・・よく分かりません) どなたか、よろしくお願いします。

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

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

tacとawkが使えるのが前提ですが。 # awkスクリプト $ cat replace.awk /<\/ABC>/{if (!flg) $0 = $0 "\nGood Evening\nGood Morning"; flg = 1} {print} # コマンドを実行 $ tac sammple.txt | awk -f replace.awk | tac <ABC> <ABC> Hello! </ABC> Good Morning Good Evening </ABC> awkも使えない?

foelinux
質問者

お礼

ありがとうございます。 tacとawk使えました! なるほど、こんな素晴らしいコマンドがあったのですね。 これらのコマンドをベースに、 シェルを組み上げて行きたいと思います。 ありがとうございました!

その他の回答 (1)

回答No.1

シェルスクリプトよりは、perlやrubyやpythonが便利でしょうね、そういう時には。 まずすべての文字情報を読み込んで、</ABC>がある行番号を探索し、最後の行に関して当てはめるというようなものですね。本当はperlやpythonにはxmlのパースする関数が用意されているので、それを使えば本当は簡単化も知れません。 ---python script---- import sys fileread=sys.stdin fp=open(fileread,'r') conts=fp.readlines() for i in range(len(conts)) : <tab> flag=0 <tab> flag=conts[i].find("ABC") <tab> if flag <> 0 : <tab> <tab> abcfind=i for i in range(len(conts)): <tab> if i == abcfind : <tab> <tab> print "Good Morning" <tab> <tab> print "Good Evening" <tab> <tab> print conts[i], <tab> else : <tab> <tab> print conts[i], ----python script----- これをtest.pyという適当なファイルの名前に保存する。 python test.py < inputfile > outputfile としてやれば、inputfileの中の</ABC>の最後の部分の直前に文章を鍾乳したoutputfileがでてきますよ。テストはしていないのでやってみてください。うえの<tab>を空白3か、それ以上の空白と置き換えてください。ここはtabが無視されるのでこういうスクリプト書きにくいですね。 同じような事をperlで書くことも出来ますよ! ----perl script---- #!/usr/bin/perl $i=0; $j=0; @data=""; while(<>){ @data=(@data,$_,"\n"); $i=$i+1; if(/ABC/){$abcfind=$i; @data=(@data,$_,"\n"); } } while($j<$i+1){ $j=$j+1; if( $j==$abcfind){ print "Good Morning"; print "Good Evening"; print $data[j]; }else{ print $data[j]; } } ---perl script--- これを適当な名前test.plで保存して、 perl test.pl inputfile> output file でいけるとおもいます。perlのほうもpythonの方も どうさかくにんしていないのでバグがあるかもです。

foelinux
質問者

補足

ありがとうございます! そうなんですよね、perlを用いれば比較的簡単に書けるのは、 なんとなく調べていて気がついいたのですが・・・。 今回は、perl環境が入っていなくても動作する方法ということで、 シェルスクリプトを用いたいと思っています。

関連するQ&A

専門家に質問してみよう