Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Script dos2unix ultra portable

23 réponses
Avatar
Stephane Gibier
Salut,

Je souhaite intégrer dans un script d'installation (install.sh) une
méthode le plus portable possible pour transformer des fichiers *.ini du
format 'DOS' (CR/LF) au format 'Unix' (LF). Pour le moment, j'utilise le
bout de script suivant qui fonctionne très bien sous Linux :

find . -name '*.ini' -exec sh -c 'sed 's/.$//' <{} >{}~; mv {}~ {}' \;

Cela ne fonctionne pas sous AIX 4.3 car le 'joker' {} n'est pas
substitué dans ce cas là. Je recherche donc un moyen hyper portable pour
effectuer cette bête transformation, sans utiliser perl, avec les moyens
posix du bord (find, sed, sh)

Auriez vous une idée ?

Merci

--
Stéphane Gibier <stephane@gibier.org>
Le maniement réitéré des fonds multiplie les mouvements de caisse
Yr znavrzrag eévgéeé qrf pbaf zhygvcyvr yrf zbhirzragf qr srffr

3 réponses

1 2 3
Avatar
Stephane CHAZELAS
Le 08 Oct 2003 04:52:15 +0200, Pascal Bourguignon écrivait :
[...]
$ find . -name '*.ini' -type f
-exec echo sh -c 'cp "$1" "${1}~" && tr -d 15 < "${1}~" > "$1"' {} {} ;
[...]

Donc: 1 fork pour le find
n forks pour les sh
n forks pour les cp
n forks pour les tr
----
1+3n forks


Mais certains shells ne forkent pas pour la dernière commande.
C'est au moins le cas de ksh93, (bash et zsh aussi, mais
apparemment pas dans ce cas particulier du cmd && cmd) tr est
executé dans le meme processus que sh, il y a un "exec tr"
implicit, si tu veux.

Pour les autres shells:

$ find . -name '*.ini' -type f
-exec echo sh -c 'cp "$1" "${1}~"
&& exec tr -d 15 < "${1}~" > "$1"' {} {} ;

--
Stéphane

Avatar
Stephane CHAZELAS
Le 08 Oct 2003 01:10:22 +0200, Pascal Bourguignon écrivait :
[...]
| awk '
{
if (NR > 1) {
printf("%s", line)
if ($0 !~ //.//)
printf("")
print ""
}
line = $0
}
END {
print line
}' |
[...]


Oulala! Mais il y a des sacrés différences avec les awk, gawk, nawk...
Je me demande si c'est pas pire que les sh A B ou sh A A...


Oui, mais là, ya rien que meme le premier awk ne reconnaisse
pas. Par contre, certains awk ont des limitations assez basses.
Ça pourrait ne pas marcher sous HPUX par exemple avec des noms
de fichiers qui contiennent plus de 100 (?) espaces (enfin
fields).

il reste toujours encore la solution du:

a='file=$f; continue'
find ./. ... | sed 's//&&/g' | while IFS= read f; do
eval "$a"; a case "$f" in
*/./*) cp ... && tr ...; file=$f;;
*) file="$file
$f";;
esac
done
${a:+":"} eval 'cp ... && tr ...'

(pas testé, ça devrait faire du 2,3 + 2n et pas trop de
commandes lancées).

L'idée d'utiliser find ./. a été piquée dans une page de man
d'xargs d'outils qui viennent juste de sortir basés sur les
sources d'Unix libérées par Caldera
(http://heirloom.berlios.de).

--
Stéphane


Avatar
Pascal Bourguignon
Stephane CHAZELAS writes:

Le 08 Oct 2003 04:52:15 +0200, Pascal Bourguignon écrivait :
[...]
$ find . -name '*.ini' -type f
-exec echo sh -c 'cp "$1" "${1}~" && tr -d 15 < "${1}~" > "$1"' {} {} ;
[...]

Donc: 1 fork pour le find
n forks pour les sh
n forks pour les cp
n forks pour les tr
----
1+3n forks


Mais certains shells ne forkent pas pour la dernière commande.
C'est au moins le cas de ksh93, (bash et zsh aussi, mais
apparemment pas dans ce cas particulier du cmd && cmd) tr est
executé dans le meme processus que sh, il y a un "exec tr"
implicit, si tu veux.


Ha! Dans ce cas, d'accord. Mais j'utilise bash...


Pour les autres shells:

$ find . -name '*.ini' -type f
-exec echo sh -c 'cp "$1" "${1}~"
&& exec tr -d 15 < "${1}~" > "$1"' {} {} ;

--
Stéphane


--
__Pascal_Bourguignon__
http://www.informatimago.com/
Do not adjust your mind, there is a fault in reality.


1 2 3