2017-12-12 22 views
1

私は9000行以上のテキストを含む100以上のファイルを持っています。いずれかのファイルのプレビュー抽出物は、次のようになります。shellscript:一致する文字列の間に数値を加算する(アップカウント)

<productname>kidscar1</productname> 
<productid>98</productid> 
<productname>kidscar2</productname> 
<productcolor>yellow</productcolor> 
<productid>101</productid> 
<productname>kidscar3</productname> 
<productsize>xxl</productsize> 
<productcolor>green</productcolor> 
<productid>104</productid> 
<productname>kidscar4</productname> 
<productcolor>bleu</productcolor> 
<productsize>xl</productsize> 
<producttype>electric</producttype> 
<productid>103</productid> 

私は別のプロダクトIDから始まるIDの生成物を(再arange)を変更し、自動的含む次の行のためにこれをカウントアップしようとしています製品番号。

私はforループで使用できるシェルスクリプトソリューションを考えていました。

**sh idscript.sh oldfile.txt 1000 productid > newfile.txt** 

結果:

<productname>kidscar1</productname> 
<productid>1000</productid> 
<productname>kidscar2</productname> 
<productcolor>yellow</productcolor> 
<productid>1001</productid> 
<productname>kidscar3</productname> 
<productsize>xxl</productsize> 
<productcolor>green</productcolor> 
<productid>1002</productid> 
<productname>kidscar4</productname> 
<productcolor>bleu</productcolor> 
<productsize>xl</productsize> 
<producttype>electric</producttype> 
<productid>1003</productid>` 

私はそれが次のコマンドを使用して、sedの中で行全体を交換することが可能だということを知っている:

**sed "s/<productid>100</productid>=.*/<productid>=<productid>1000</productid>/g"** 

しかし、私はこの作業を行うことができますどのように取得するには上記の結果は?これを達成するための他の(より単純な)方法がある場合、私もそれを聞いて好きです!

答えて

2

sedはs/old/newのすべてです。この場合、あなたはインクリメント製品を追跡する数値変数を必要とsedはこれだけのawkを使用し、すべての変数をサポートしていません:

$ awk -v pid=1000 '/<productid>/{sub(/[0-9]+/,pid++)}1' file 
<productname>kidscar1</productname> 
<productid>1000</productid> 
<productname>kidscar2</productname> 
<productcolor>yellow</productcolor> 
<productid>1001</productid> 
<productname>kidscar3</productname> 
<productsize>xxl</productsize> 
<productcolor>green</productcolor> 
<productid>1002</productid> 
<productname>kidscar4</productname> 
<productcolor>bleu</productcolor> 
<productsize>xl</productsize> 
<producttype>electric</producttype> 
<productid>1003</productid> 
+0

ニース。 productid文字列がRSとして使用され、すべての数字が削除され、インクリメントされたPID開始文字が1000から書き込まれますか? – SriniV

+0

いいえ、 'pid'は数値を含む変数です。既存の数値をその値に置き換えてポストインクリメントしています。私はRSで何もしていない。 –

+1

インフォア・エドのためのThanx、まさに私が探していたもの! –

0

awk後、あまりにも同じであなたを助けるかもしれません。

awk -v val=1000 '/productid/{sub(/>[0-9]+</,">"val++"<")} 1' Input_file 
+1

@エドモートン、変更を行った、はい私は考えていた場合はnull値の場合 ' '、OPはそれに言及していませんでしたが、それをカバーすると思ったが、私に知らせてくれた。 – RavinderSingh13

関連する問題