Je veux remplacer le mot exact en utilisant sed

-1

Mon but est d’ajouter "des guillemets chaque fois que le mot ci-dessous arrive dans le fichier.

VGHIER_TSV_WB798
CBVGHIER_TSV_WB798

ici

sed -i 's/"VGHIER_TSV_WB798"./VGHIER_TSV_WB798./g'

est utilisé pour supprimer la double citation, le cas échéant, et

sed -i 's/VGHIER_TSV_WB798./"VGHIER_TSV_WB798"./g'

pour ajouter la citation mais le problème que je me pose quand nous avons eu le CBVGHIER_TSV_WB798c'est repalced comme CB"VGHIER_TSV_WB798", ce que je ne veux pas, j'ai une déclaration sed séparée pour repalce le mot suivant

sed -i 's/CBVGHIER_TSV_WB798./"CBVGHIER_TSV_WB798"./g'

Pourriez-vous m'aider, s'il vous plaît, à atteindre cet objectif?

RAM
la source
1
Le problème vient donc du moment où cette chaîne apparaît dans un mot plus long. Pourriez-vous nous montrer un exemple de contenu du fichier d'entrée? Ces mots sont-ils la seule chose sur la ligne? En outre, quelle version de sedutilisez-vous?
JigglyNaga
@JigglyNaga - n'est-ce pas une chose -ia GNU?
Guy
1
@Guy C'est non standard, mais souvent implémenté (bien qu'avec des sémantiques variables). Voir par exemple unix.stackexchange.com/questions/401905/…
Kusalananda

Réponses:

2

Si votre sedsupporte les ERE, vous pouvez ajouter le en CBtant que partie optionnelle du motif à rechercher. Cela remplacerait les deux:

sed -E 's/(CB)?VGHIER_etc/"\1VGHIER_etc"/g'  test

Ou, si vos sedsupports \<et \>pour le début et la fin du mot, utilisez ceux-ci:

sed 's/\<VGHIER_etc\>/"VGHIER_etc"/g'  test

De plus, vous avez un point final .dans le motif, il correspondra à tout caractère et il sera remplacé en tant que partie de la chaîne. Le point dans le remplacement mettra un point littéral en arrière. s/foo./"foo"./changements foodà"foo".

ilkkachu
la source
1

Je pense que vous souhaitez ajouter un préfixe à votre chaîne de recherche. Si le mot que vous essayez de remplacer sera toujours précédé d'un espace:

sed -i 's/ VGHIER_TSV_WB798\./ "VGHIER_TSV_WB798"./g'

De manière plus générique, vous pouvez utiliser le groupe regex [[:space:]]pour couvrir les cas d'espaces ou de tabulations, etc. (voir la man isspaceliste complète).

sed -i 's/\([[:space:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

Dans ce cas, nous devions ajouter une complexité supplémentaire en créant un groupe de regex utilisant les parenthèses et en utilisant une référence arrière \1 pour être sûr de ne pas perdre le caractère exact lors du remplacement. Il existe également une classe regex [[:punct:]]pour les caractères de ponctuation, au cas où le mot serait parfois précédé de l'un d'entre eux. Voir man isspacepour une liste complète et détaillée de ce que couvre chaque classe de caractères regex.

Voici un exemple de solution plus complexe pour couvrir le cas de préfixes de ponctuation possibles:

sed -i 's/\([[:space:]]\|[[:punct:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

Ceci utilise la directive regex |(avec une barre oblique inverse pour sed) pour indiquer une alternative.

Enfin, si le mot sera toujours le premier élément de la ligne, utilisez la ^regex pour exiger que:

sed -i 's/^VGHIER_TSV_WB798\./"VGHIER_TSV_WB798"./g'

Et oui, pour tout ce qui précède, vous pourriez avoir "groupé" ed et "référencé en arrière" votre chaîne:

sed -i 's/^\(VGHIER_TSV_WB798\)\./"\1"./g'
sed -i 's/\([[:space:]]\|[[:punct:]]\)\(VGHIER_TSV_WB798\)\./\1"\2"./g'
utilisateur1404316
la source