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 ligneCependant, je reçois l'erreur suivante avec la commande ci-dessus.
Variable name must contain alphanumeric characters.
Mon shell actuel est /bin/csh
.
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.
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.
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.
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.
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.