Comment échapper un chemin de fichier dans SED?


40

Je voudrais remplacer $fileWithPathdans $file, cependant cela ne fonctionne pas parce que (je pense) le chemin n'est pas échappé. Comment y échapper?

sed -i 's/${fileWithPath}/HAHA/g' $file

Réponses:


72
sed -i 's|'$fileWithPath'|HAHA|g' file

Les guillemets simples définissent un littéral de chaîne. Mettre la variable en dehors du littéral permet au shell de développer cette partie.

De plus, si vous allez analyser les chemins, utilisez un délimiteur dans la commande sed qui ne confond pas avec le délimiteur de répertoire "/".


1
Attention, si $fileWithPathcontient des espaces, le mauvais modèle est inséré.
Lekensteyn

Votre astuce bonus sur la modification du délimiteur pour les chemins de fichiers a été une bouée de sauvetage!
Shadoninja

Je pense que vous avez trop de citations dans votre commande. Mon exemple sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnsemble fonctionner.
Léo Léopold Hertz

15

Une meilleure méthode pour les chaînes littérales avec des barres obliques:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt

Celui-ci méritait un Oscar! Simple et élégant
Toan Nguyen Le

15

Dans les cas où la chaîne de remplacement ou la chaîne de modèle contient des barres obliques, vous pouvez utiliser le fait que GNU sed autorise un séparateur alternatif pour la commande substitute. Les choix courants pour le délimiteur sont le caractère pipe | ou le hash # - le meilleur choix de caractère de délimitation dépendra souvent du type de fichier en cours de traitement. Dans votre cas, vous pouvez essayer

sed -i 's#'$fileWithPath'#HAHA#g' $file

Le caractère 'g' après le dernier # est utilisé pour changer toutes les occurrences du fichier si vous ne devez modifier que la première occurrence puis supprimez le 'g'.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.