
こんにちは。
シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。
・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で文字列を挿入するなどですが・・・よく分かりません)
どなたか、よろしくお願いします。
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も使えない?
ありがとうございます。
tacとawk使えました!
なるほど、こんな素晴らしいコマンドがあったのですね。
これらのコマンドをベースに、
シェルを組み上げて行きたいと思います。
ありがとうございました!
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の方も
どうさかくにんしていないのでバグがあるかもです。
この回答への補足
ありがとうございます!
そうなんですよね、perlを用いれば比較的簡単に書けるのは、
なんとなく調べていて気がついいたのですが・・・。
今回は、perl環境が入っていなくても動作する方法ということで、
シェルスクリプトを用いたいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
「トゥ]の出し方
-
Linux のシェルスクリプトの強...
-
EXT4-fs error (device sdb3): ...
-
ubuntu(linux)のシャットダウン...
-
ubuntuで デイスク/deb/loopと...
-
Linuxでブートディスクの交換後...
-
Lubuntuでとにかく軽量のバージ...
-
AWSでSSH接続をしたいのですが...
-
Ubuntu on Xorgのログインについて
-
ubuntu が起動しない。
-
ubuntu proのデスクトップ版は...
-
ubuntuのシャットダウンが進ま...
-
shellscript内のコマンドを、su...
-
ubuntuのターミナルで書いたコ...
-
bashでシングルクォート内の変...
-
linuxサーバーのキャッシュをク...
-
TCPWrapper のインストールにつ...
-
「/var/log」内のログの削除の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
インストールできないですどう...
-
ubuntu(linux)のシャットダウン...
-
Linuxでブートディスクの交換後...
-
bashでシングルクォート内の変...
-
WinSCPでLinux(CentOS6.10)に...
-
ubuntuのシャットダウンが進ま...
-
Linux のシェルスクリプトの強...
-
CentOSが起動時にフリーズ
-
ubuntuで デイスク/deb/loopと...
-
Ubuntu on Xorgのログインについて
-
「トゥ]の出し方
-
Windowsのローカルディレクトリ...
-
apacheでリバースプロキシを設...
-
ubuntu 24 へのCanon 複合機ス...
-
ログにserver reached MaxReque...
-
WineのRufusでデバイスを検知す...
-
ssl_request_logの必要性について
-
「/var/log」内のログの削除の...
おすすめ情報