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
UAdapter
la source

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 "/".

à
la source
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
Jeff Lancaster
la source
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'.

c0m3t
la source