Convert .../($var1|$var2)/... regex to string

Hello,

In one part of my shell program I need to translate many of lines in the following pattern :

/(folder1|...|folderN)/(sub1|...|subN)/.../(file1|...|fileN)

into strings :

/folder1/sub1/.../file1
/folder1/sub1/.../...
/folder1/sub1/.../fileN
...
/folderN/subN/.../fileN

the folderX/fileX is just a variable and it could be any name.

Please help me obtaining the shell script.

sample input :

/(ar|az|dua|en|fa|fr)/(index|index2).php
/(ar|az|dua|en|fa|fr)/administrator/(index|index2).php
/(ar|fa)/modules/(mod_tabmods|mod_tabs|mod_base|mod_secure)/scripts/(importer|uploader).php

desired output :

/ar/index.php
/ar/index2.php
/az/index.php
/az/index2.php
/dua/index.php
/dua/index2.php
/en/index.php
/en/index2.php
/fa/index.php
/fa/index2.php
/fr/index.php
/fr/index2.php
/ar/administrator/index.php
/ar/administrator/index2.php
/az/administrator/index.php
/az/administrator/index2.php
/dua/administrator/index.php
/dua/administrator/index2.php
/en/administrator/index.php
/en/administrator/index2.php
/fa/administrator/index.php
/fa/administrator/index2.php
/fr/administrator/index.php
/fr/administrator/index2.php
/ar/modules/mod_tabmods/scripts/importer.php
/ar/modules/mod_tabmods/scripts/uploader.php
/ar/modules/mod_tabs/scripts/importer.php
/ar/modules/mod_tabs/scripts/uploader.php
/ar/modules/mod_base/scripts/importer.php
/ar/modules/mod_base/scripts/uploader.php
/ar/modules/mod_secure/scripts/importer.php
/ar/modules/mod_secure/scripts/uploader.php
/fa/modules/mod_tabmods/scripts/importer.php
/fa/modules/mod_tabmods/scripts/uploader.php
/fa/modules/mod_tabs/scripts/importer.php
/fa/modules/mod_tabs/scripts/uploader.php
/fa/modules/mod_base/scripts/importer.php
/fa/modules/mod_base/scripts/uploader.php
/fa/modules/mod_secure/scripts/importer.php
/fa/modules/mod_secure/scripts/uploader.php

Post withdrawn...didn't see your sample input and expected output :slight_smile:

"Your shell program"... Which shell?

For instance, in bash you can use brace expansion:

echo /{ar,az,dua,en,fa,fr}/{index,index2}.php
/ar/index.php /ar/index2.php /az/index.php /az/index2.php /dua/index.php /dua/index2.php /en/index.php /en/index2.php /fa/index.php /fa/index2.php /fr/index.php /fr/index2.php

If you have stored the string in a variable, say $input, then:

input="/{ar,az,dua,en,fa,fr}/{index,index2}.php"
eval echo "$input"
/ar/index.php /ar/index2.php /az/index.php /az/index2.php /dua/index.php /dua/index2.php /en/index.php /en/index2.php /fa/index.php /fa/index2.php /fr/index.php /fr/index2.php

So, first change the format from "/(ar|az|dua|en|fa|fr)/(index|index2).php" to "/{ar,az,dua,en,fa,fr}/{index,index2}.php". After you've checked that neither "{", "}", nor "," are present in your paths, do it this way:

input_forBE="$(sed -e 's/(/{/g' -e 's/)/}g' -e 's/|/,/g'  <<<$input)"

Then use bash brace expansion, as shown above. For instance:

eval ls "$input_forBE"
ls: impossibile accedere a /ar/index.php: File o directory non esistente
ls: impossibile accedere a /ar/index2.php: File o directory non esistente
ls: impossibile accedere a /az/index.php: File o directory non esistente
ls: impossibile accedere a /az/index2.php: File o directory non esistente
ls: impossibile accedere a /dua/index.php: File o directory non esistente
ls: impossibile accedere a /dua/index2.php: File o directory non esistente
ls: impossibile accedere a /en/index.php: File o directory non esistente
ls: impossibile accedere a /en/index2.php: File o directory non esistente
ls: impossibile accedere a /fa/index.php: File o directory non esistente
ls: impossibile accedere a /fa/index2.php: File o directory non esistente
ls: impossibile accedere a /fr/index.php: File o directory non esistente
ls: impossibile accedere a /fr/index2.php: File o directory non esistente

--
Bye