web-dev-qa-db-fra.com

Erreur lors de la mise en correspondance de la fin de ligne avec la commande $ in Sed

J'applique actuellement la commande ci-dessous dans csh par le biais d'un script Shell.

sed -i "s/cb $i$/cb $i $cb/" */callback_events

Où:

  • $i - Valeur de la variable i
  • $cb - Valeur de la variable cb
  • $ - Pour faire correspondre la fin de la ligne

Cependant, je reçois l'erreur suivante avec la commande ci-dessus.

Variable name must contain alphanumeric characters.

Mon shell actuel est /bin/csh.

1
Karan Shah

Vous devez citer le caractère $ pour pouvoir se représenter lui-même dans une chaîne entre guillemets doubles; sinon, le Shell pensera qu'il introduit un développement variable, et ne sera pas satisfait si le caractère qui le suit n'est pas alphabétique ou l'une des variables spéciales.

sed -i "s/cb $i\$/cb $i $cb/" */callback_events

Il y a deux niveaux d'interprétation des caractères ici.

  1. Le shell lit d'abord la commande et applique ses règles. L'une des règles est que, à l'intérieur des guillemets doubles, $ introduit le développement de variable, sauf si elle est citée.

  2. Une fois le shell terminé, la commande ressemble à ceci:

    sed -i s/cd <value-of-i>$/cd <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...
    

    Notez que les guillemets ont disparu, $i et $cb sont remplacés par leurs valeurs et \$ est devenu uniquement $. De plus, */callback_events a été remplacé par une liste de fichiers.

  3. Ceci est ensuite passé à sed, qui applique les règles ses. L'une de ces règles est qu'un $ à la fin du modèle de recherche signifie la fin de la ligne.

4
AlexP

J'utilise Ubuntu Studio 18 L'erreur $ est due à "extension bash" remarquez les erreurs lorsque vous exécutez $ 0 vs $ (0) vs "$ 0"

Une alternative à la recherche de la fin de ligne dans le script sed est trouver tout et utiliser la variable & pour ajouter des éléments après; C'est utilisé comme ça:

echo "this was here" | sed -e 's_.*_& YOURFOOBAR_'

Si vous apprenez le script sed, vous pouvez rechercher une clé de début avec _^_ et ajouter plusieurs commandes sed avec des caractères _;_. Ici, j'utilise '_' ou '/' indifféremment pour la commande de remplacement du script sed 's ///'

echo "this was here" | sed -e 's/^/PREFIXEDTEXT /;s_.*_& SUFFIXEDTEXT_'

NOTE: La commande de test est aliasée comme so alias [= test donc cela pose des problèmes je pense avec bash Expansion. voir l'homme bash choses comme & | ne travaille pas.

Enfin, je suggère d'acheter un livre sur eBay plutôt que d'essayer d'apprendre ici.

1
openInvent