|
|
|
|
Salut,
Pour déboguer un batch DOS, je cherche à matcher des lignes foireuses, par exemple celles qui pourraient contenir un guillemet suivi de n'importe quelle expression sauf un guillemet. Aucun de mes essais n'a abouti à qque chose de valable.
Finalement, encore plus intéressant, j'ai pensé plutôt à matcher ttes les lignes d'un fichier qui contiennent un nombre impair de guillemets
"coucou" cou"cou cou""cou coucou" "couco"u"
Configuration: Windows XP Firefox 3.0.8
Salut,
[tmpfs]$ cat -n plop
1 "coucou"
2 cou"cou
3 cou""cou
4 coucou"
5 "cou"cou"
6 "cou"c"o"u
[tmpfs]$ cat -n plop | sed -n 'h;:z;/"/{s/\("[^"]*"\)//1;tz;g;p}'
2 cou"cou
4 coucou"
5 "cou"cou"
[tmpfs]$Si tu ne veux pas du "cat -n" remplace-le par :sed = plop | sed 'N;s/\n/ - /' |;-)) $ man woman Il n'y a pas de page de manuel pour woman. |
Merci :-) Mais bon le sed modifie la ligne. Mon approche consiste à virer les "xxx". Du coup si le nombre de guillemets est impair, il en reste un après le sed et le dernier grep extrait la ligne (modifiée donc).
|
Merci :)
for /f "tokens=*" %%A IN (Path.txt) DO ECHO %%A | sed -e "s/\"[^\"]*\"//g" | grep -n "\"" voilà l'interprétation : >for /F "tokens=*" %A IN (Path.txt) DO ECHO %A | sed -e "s/\"[\"]*\"//g" | grep -n "\"" >ECHO "coucou" | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. >ECHO cou"cou | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. >ECHO cou""cou | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. >ECHO coucou" | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. >ECHO "couco"u" | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. >ECHO ~%%i | sed -e "s/\"[\"]*\"//g" | grep -n "\"" sed: can't read |: Invalid argument sed: can't read grep: No such file or directory sed: can't read ": Invalid argument Le processus a tenté d'écrire sur un canal inexistant. j'utilise ce sed http://gnuwin32.sourceforge.net/packages/sed.htm 4.1.5 Le fait d'écrire un script après comme suggéré ne serait pas contraignant, le vrai souci c'est d'arriver à encadrer ce motif qui parait tout simple :) |
Ma solution au post #1 ne va pas ?
|
#n # Affichage sur demande
h # On stocke la ligne dans la mémoire annexe
:z # Étiquette
/"/ { # Si on trouve un guillemet
s/\("[^"]*"\)//1 # On essaie de substituer tout ce qui se
# trouve entre 2 guillemets par rien
t z # Si une substitution a eu lieu on se branche
# à l'étiquette et on remet ça
g # Sinon (qu'un guillemet restant) on remet
# la ligne stockée dans la mémoire secondaire
# dans l'espace de travail
p # Et on l'imprime
}
$ man woman
Il n'y a pas de page de manuel pour woman. |
Super, merci encore ;)
grep -n "." Path.txt | sed -n "h;:z;/%/{s/\(%[^%]*%\)//1;tz;g;p}"
ça ne fonctionne pas, même en protégeant le % avec un antislash, tu aurais une idée ? car comme précisé avec d'autres caractères recherchés, tel que le ^, et une fois protégé, >grep -n "." Path.txt | sed -n "h;:z;/\^/{s/\(\^[^\^]*\^\)//1;tz;g;p}"
8:cou^cou
le motif est bien trouvé. |
[tmpfs]$ cat plop
%coucou%
cou%cou
cou%%cou
coucou%
%cou%cou%
%cou%c%o%u
[tmpfs]$ cat -n plop | sed -n 'h;:z;/%/{s/\(%[^%]*%\)//1;tz;g;p}'
2 cou%cou
4 coucou%
5 %cou%cou%
[tmpfs]$Chez moi ça marche, par contre comme "%" est un caractère réservé de Windows (au même titre que "!" pour GNU/Linux), il est fort possible que ça interfère...
Désolé ;-( $ man woman Il n'y a pas de page de manuel pour woman. |
Sous windows je crois que les ' ' ne marchent pas
grep -n '.' Path.txt | sed -n 'h;:z;/\"/{s/\(\"[\"]*\"\)//1;tz;g;p}'
sed: -e expression #1, char 1: unknown command: `''
Sans par contre c'est possible, parfois grep -n . Path.txt | sed -n h;:z;/\"/{s/\(\"[\"]*\"\)//1;tz;g;p}
1:"coucou"
2:cou"cou
4:coucou"
5:"couco"u"
Pour en revenir à la recherche du motif "% impair" pas trouvé de solutions, guillemets ou pas, et même en faisant passer ce caractère dans une variable rien à faire, il ne s'affiche pas grep -n . Path.txt | sed -n h;:z;/\[\\)//1;tz;g;p} sed: -e expression #1, char 13: unknown command: `/' grep: write error: Invalid argument quoique... grep "%" Path.txt utryu%uio je vais voir peut être avec findstr... |
>grep -n "." Path.txt | sed -n 'h;:z;/[\)//1;tz;g;p}' sed: -e expression #1, char 1: unknown command: `'' grep: write error: Invalid argument Edit > >grep -n "." Path.txt | sed -n "h;:z;/[\)//1;tz;g;p}" sed: -e expression #1, char 20: unterminated address regex bouh :/ ça doit vraiment être ce caractère %, s'il y en a deux il doit supposer que ce qui se situe entre est une variable, et vu que ce n'est pas déclaré parcequ'elle n'existe pas, ça ne fonctionne pas. Cet exemple avec les & marche, sans protection... >grep -n "." Path.txt | sed -n "h;:z;/&/{s/\(&[&]*&\)//1;tz;g;p}"
8:regrg&gedr
faudrait l'empêcher d'interpréter le % c'est pas gagné. Avec d'autres séparateurs pour SED tu crois que c'est possible ?
|
Hello
awk ' /\"/ {x=$0;n=gsub("\"", "X", x);if(n % 2 ) print NR, $0 }' |