重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!gooアプリ版

こんにちは。

シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。

・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で文字列を挿入するなどですが・・・よく分かりません)


どなたか、よろしくお願いします。

A 回答 (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も使えない?
    • good
    • 0
この回答へのお礼

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

ありがとうございました!

お礼日時:2007/09/13 14:00

シェルスクリプトよりは、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の方も
どうさかくにんしていないのでバグがあるかもです。

この回答への補足

ありがとうございます!
そうなんですよね、perlを用いれば比較的簡単に書けるのは、
なんとなく調べていて気がついいたのですが・・・。

今回は、perl環境が入っていなくても動作する方法ということで、
シェルスクリプトを用いたいと思っています。

補足日時:2007/09/13 12:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!