Comment utiliser un remplacement de nouvelle ligne dans un système BSD sed?
Question
Bonjour, comment puis-je effectuer les opérations suivantes dans BSD sed?
sed 's/ /\n/g'
Dans la page de manuel, il est indiqué que \ n sera traité littéralement dans une chaîne de remplacement. Comment puis-je éviter ce comportement? Y a-t-il un remplaçant?
J'utilise Mac OS Snow Leopard, je peux installer fink pour obtenir GNU sed.
La solution
Dans un shell, vous pouvez faire:
sed 's/ /\
/g'
appuyer sur la touche Entrée après la barre oblique inverse pour insérer une nouvelle ligne.
Autres conseils
Pour ma facilité d'utilisation, j'utilise souvent souvent
cr="\n"
# or (depending version and OS)
cr="
"
sed "s/ /\\${cr}/g"
afin qu'il reste sur 1 ligne.
Pour développer la réponse de @ sikmir: dans Bash, qui est le shell par défaut sous Mac OS X, il vous suffit de placer un caractère $
devant la chaîne entre guillemets contenant la séquence d'échappement. que vous voulez faire interpréter. Bash le traduira automatiquement pour vous.
Par exemple, j'ai supprimé tous les retours chariot MS-DOS de tous les fichiers source dans lib /
et include /
en écrivant:
grep -lr
BSD grep
aurait interprété '\ r'
correctement, mais l'utilisation de $ '\ r'
ne fait pas mal.
BSD sed
aurait mal interprété '/ \ r //'
seul, mais en utilisant $ 's / \ r //'
, j’ai évité ce piège.
Notez que nous pouvons mettre $
devant la chaîne entière et qu'il se chargera de toutes les séquences d'échappement de la chaîne.
$ echo \r' lib include | xargs sed -i -e
BSD grep
aurait interprété '\ r'
correctement, mais l'utilisation de $ '\ r'
ne fait pas mal.
BSD sed
aurait mal interprété '/ \ r //'
seul, mais en utilisant $ 's / \ r //'
, j’ai évité ce piège.
Notez que nous pouvons mettre $
devant la chaîne entière et qu'il se chargera de toutes les séquences d'échappement de la chaîne.
<*>s/\r//'
find . -name '*-e' -delete
BSD grep
aurait interprété '\ r'
correctement, mais l'utilisation de $ '\ r'
ne fait pas mal.
BSD sed
aurait mal interprété '/ \ r //'
seul, mais en utilisant $ 's / \ r //'
, j’ai évité ce piège.
Notez que nous pouvons mettre $
devant la chaîne entière et qu'il se chargera de toutes les séquences d'échappement de la chaîne.
<*>hello\b\\world'
hell\world
\r' lib include | xargs sed -i -e
BSD grep
aurait interprété '\ r'
correctement, mais l'utilisation de $ '\ r'
ne fait pas mal.
BSD sed
aurait mal interprété '/ \ r //'
seul, mais en utilisant $ 's / \ r //'
, j’ai évité ce piège.
Notez que nous pouvons mettre $
devant la chaîne entière et qu'il se chargera de toutes les séquences d'échappement de la chaîne.
BSD grep
aurait interprété '\ r'
correctement, mais l'utilisation de $ '\ r'
ne fait pas mal.
BSD sed
aurait mal interprété '/ \ r //'
seul, mais en utilisant $ 's / \ r //'
, j’ai évité ce piège.
Notez que nous pouvons mettre $
devant la chaîne entière et qu'il se chargera de toutes les séquences d'échappement de la chaîne.