Obtenez tout entre 2 modèles dans unix

J’ai besoin d’un liner awk / cut pour obtenir tout entre un motif et le dernier nom de fichier, par exemple:

$ cat .exportfiles.text /twigs/WP_Fix/Code/SharedApp/src/gov/illinois/ies/business/rules/ed/CorticonFinIncomeEntiyLoader.java /twigs/WP_Fix/Code/BEAN/Framework/ejbModule/gov/illinois/ies/business/rules/entities/fin/Income.java /twigs/WP_Fix/settings/Environment/RT/properties/build.properties /twigs/WP_Fix/test/Environment/DEV/properties/build.properties 

Sortie désirée:

 Code/SharedApp/src/gov/illinois/ies/business/rules/ed Code/BEAN/Framework/ejbModule/gov/illinois/ies/business/rules/entities/fin settings/Environment/RT/properties test/Environment/DEV/properties 

 sed -e 's,/twigs/WP_Fix/\(.*\)/.*,\1,' < exportfiles.text 

Voici une solution cut pour être complet.

 cut -d / -f 4- .exportfiles.text | xargs -n 1 dirname 

Il n’utilise pas seulement cut , car il est impossible de spécifier des colonnes à partir du dernier précédent.

Cette ligne pourrait fonctionner:

 awk -F'/[^/]*$' '{sub("/twigs/WP_Fix/","",$1)}$0=$1' file 

le "/twigs/WP_Fix/" pourrait être une variable shell pour rendre la ligne plus flexible.

Une solution awk alternative qui ne vous permet pas de gérer vous-même les séparateurs:

 awk -v FS=/ -v OFS=/ '{ for (i=1; i 

... au golf, pour les gens qui aiment ce genre de chose:

 awk -F/ -v OFS=/ '{for(i=0;++i 

Mais celui-ci pourrait être plus facile si vous sortez le Perl:

 perl -F/ -lane 'print join "/", @F[ 3 .. ($#F - 1) ]' exportfiles.txt 

..ou

  perl -F/ -lane '$,="/";print@F[3..$#F-1]' exportfiles.txt 

Solution simple bash :

 while IFS= read -r file; do file=${file%/*}; file=${file#/*/*/}; echo "$file"; done < exportfiles.txt 

Tester:

 [jaypal:~/Temp] while IFS= read -r file; do file=${file%/*}; file=${file#/*/*/}; echo "$file"; done < exportfiles.txt Code/SharedApp/src/gov/illinois/ies/business/rules/ed Code/BEAN/Framework/ejbModule/gov/illinois/ies/business/rules/entities/fin settings/Environment/RT/properties test/Environment/DEV/properties 
 perl -F"/" -lane 'print join "/",@F[3..scalar(@F)-2]' your_file 

testé:

 > cat temp /twigs/WP_Fix/Code/SharedApp/src/gov/illinois/ies/business/rules/ed/CorticonFinIncomeEntiyLoader.java /twigs/WP_Fix/Code/BEAN/Framework/ejbModule/gov/illinois/ies/business/rules/entities/fin/Income.java /twigs/WP_Fix/settings/Environment/RT/properties/build.properties /twigs/WP_Fix/test/Environment/DEV/properties/build.properties > perl -F"/" -lane 'print join "/",@F[3..scalar(@F)-2]' temp Code/SharedApp/src/gov/illinois/ies/business/rules/ed Code/BEAN/Framework/ejbModule/gov/illinois/ies/business/rules/entities/fin settings/Environment/RT/properties test/Environment/DEV/properties > 

Au-dessus, j’ai utilisé autosplit.Au lieu de cela, vous pouvez utiliser cette fonction de la même façon:

 perl -lne 'print $1 if(/\/twigs\/WP_Fix\/(.*)\//)' your_file