0

I have xml file which contains data .

<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7-4825</FATURANO>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

I want to split only FATURANO Like that

6-R-7

and

4825

And this "4825" should have different name.

<STOKUNIT>
          <BELGETARIGI>2017-09-20</BELGETARIGI>
          <STOKKODU>1KKUPS0098</STOKKODU>
          <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
          <RENK>139</RENK>
          <BEDEN>.</BEDEN>
          <STOKBARKODU>8680044399128</STOKBARKODU>
          <FATURANO>6-R-7</FATURANO>
          ***<NEWONE>4825</NEWONE>***
          <MAGAZAKODU>MGUR-02</MAGAZAKODU>
          <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
          <MIKTAR>1.00</MIKTAR>
          <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
          <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
          <KDVTUTAT>4.71</KDVTUTAT>
          <FIYAT>30.89</FIYAT>
          <TUTAR>30.89</TUTAR>
          <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
          <BIRIMFIYAT>30.89</BIRIMFIYAT>
          <NETTUTAR>30.89</NETTUTAR>
          <ODEMETIPI> Nakit</ODEMETIPI>
          <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

I Need convert xml data like that but if u answer me only with first question how to split string correctly i will do other transpormation

Cyrus
  • 84,225
  • 14
  • 89
  • 153
DaviD
  • 31
  • 6

3 Answers3

4

Since awk tag is added by OP so trying to answer in it.

awk -v s1="  " -F"[><]" '
/FATURANO/{
  match($3,/.*-/);
  val1=substr($3,RSTART,RLENGTH-1);
  val2=substr($3,RLENGTH+1);
  print $0 RS s1 "<test>" val1 "</" val1 ">" RS s1 "<test>" val2 "</" val2 ">";
  next
}
1
'   Input_file
RavinderSingh13
  • 130,504
  • 14
  • 57
  • 93
  • 1
    Thanks that was exactly what i need – DaviD Oct 27 '17 at 17:01
  • xmlstarlet, with its proper XML parser, is the right tool for this task, not awk, with its regex-based parsing. See [Cyrus' answer](https://stackoverflow.com/a/46980218/290085) for a better way. See also [***Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms***](http://stackoverflow.com/questions/6751105/why-its-not-possible-to-use-regex-to-parse-html-xml-a-formal-explanation-in-la) – kjhughes Oct 27 '17 at 17:11
4

With xmlstarlet and bash's Parameter Expansion:

string=$(xmlstarlet select --template --value-of '//STOKUNIT/FATURANO' file.xml)
part1="${string%-*}"
part2="${string##*-}"
xmlstarlet edit --omit-decl --update '//STOKUNIT/FATURANO' --value "$part1" --append '//STOKUNIT/FATURANO' --type elem -n NEWONE --value "$part2" file.xml

If you want to edit file.xml inplace, add option -L to last xmlstarlet command.

Output:

<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7</FATURANO>
  <NEWONE>4825</NEWONE>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

See: xmlstarlet select --help and xmlstarlet edit --help

Cyrus
  • 84,225
  • 14
  • 89
  • 153
3

With single xmlstarlet expression:

xmlstarlet ed -u '//STOKUNIT/FATURANO' -x "substring(., 0,string-length(.)-4)" \
-a '//STOKUNIT/FATURANO' -t elem -n NEWONE \
-v "$(xmlstarlet sel -t -v 'substring(//STOKUNIT/FATURANO, string-length(//STOKUNIT/FATURANO)-3)' file.xml)" file.xml 
  • ed - edit mode

  • -x - xpath expression

  • -a - append element

  • -t - the type of the appended element (in edit mode)

  • -n - the name of the appended element

  • -v - the value of the updated/appended element


The output:

<?xml version="1.0"?>
<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7</FATURANO>
  <NEWONE>4825</NEWONE>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105