Encore une autre question sur la consommation de la barre oblique inverse dans la commande / script bash, alors que le but ultime est de changer la barre oblique inverse en barre oblique. Il y a plusieurs articles à ce sujet dans stackoverflow. La plupart suggèrent d'utiliser

"read -r"

Et après avoir joué pendant un certain temps, je suis coincé. Je ne sais pas si c'est un problème osx ou un problème bash que je rencontre.

Cependant, dans mon mac bash en utilisant la fonction suivante

slashme () 
{ 
  read -r varname;
  echo "$varname";
  echo "$1"; 
  x="$(echo "$1" | sed 's.\\.\/.g')"; 
  echo "$x"; 
}

Et l'entrée suivante

slashme "\\my\\precious"

> \my\precious
> 
> /my/precious

Ce à quoi je m'attendrais, c'est de suivre:

\\my\\precious

//my//precious

Alors, quel est l'interrupteur magique qui me manque? J'utilise GNU Bash 3.2.57 (1) -release (x86_64-apple-darwin-15)

1
thassan 20 avril 2017 à 21:53

3 réponses

Meilleure réponse

\\ représente une barre oblique inverse littérale dans une chaîne entre guillemets. Utilisez des guillemets simples:

slashme '\\my\\precious'
3
chepner 20 avril 2017 à 19:19

Si vous utilisez Bash, vous n'avez même pas besoin de sed, Bash peut effectuer le remplacement de chaîne par lui-même:

Par exemple:

$ slashme() { 
  x=${1//\\/\/}
  echo "$x"; 
}

$ slashme '\\my\\precious'
//my//precious

Le point de devoir citer la chaîne pour éviter que les contre-obliques ne soient traités spécialement, est valable.

Si vous ne souhaitez pas ajouter de guillemets, vous pouvez utiliser read et saisir la chaîne après avoir exécuté la fonction:

$ slashme() { 
    read -r x
    echo "${x//\\/\/}"
}
$ slashme 
\\my\\precious
//my//precious
2
ilkkachu 21 avril 2017 à 15:02

Pour compléter les réponses existantes et utiles en répondant au désir connexe du PO de ne pas avoir à saisir de guillemets sur la ligne de commande :

  • Comme le souligne ikkachu, il n’existe aucun moyen de ne pas citer correctement les arguments , car le shell interprète les arguments avant qu'ils ne soient transmis à la commande cible.

  • Vous pouvez simplifier la saisie des guillemets nécessaires en définissant des readline macros qui insèrent paires de guillemets et placent le curseur entre elles - voir au dessous de.

Ajoutez les définitions suivantes à votre fichier ~/.inputrc:

# Insert paired quotes and place the cursor between them.
# \e is ESC
# \e[D moves the cursor left
"\e\"": "\"\"\e[D"
"\e'": "''\e[D"   

La prochaine fois que vous ouvrirez un shell, vous pourrez taper ESC , ' et ESC , " pour insérer une paire de guillemets simples / doubles et placer le curseur entre eux.

Notez que vous appuyez d'abord sur ESC et puis sur le caractère guillemet.

Cependant, les applications de terminal peuvent être configurées pour utiliser la touche Alt ( Option ) à la place, ce qui permet d'utiliser la méthode plus rapide de simultanément en appuyant sur le déclencheur de macro :

  • Alt + ' pour insérer des guillemets simples appariés
  • Alt + " pour insérer des guillemets doubles appariés

Sous macOS, ouvrez les préférences de Terminal.app, sélectionnez le profil qui vous intéresse dans l'onglet Profiles, cliquez sur l'ancre Keyboard et sélectionnez Use Option as Meta key; notez cependant que cela désactive les raccourcis clavier habituels de macOS basés sur Option à l'échelle du système pour produire des variations de caractères.

Bien sûr, vous êtes libre de choisir vos propres déclencheurs de séquence de touches / accords de touches. Voir man bash, section READLINE.

1
Community 23 mai 2017 à 12:02