Supprimer les barres obliques inverses d'un fichier texte

10

j'ai

Contribution:

 NISHA =\455  

Production:

 NISHA = 455

Je souhaite supprimer \de la sortie. J'ai essayé d'utiliser la commande sed "s/[\]//g" Pmais cela ne fonctionne pas et cela signale une erreur:

character found after backslash is not meaningful
yisha
la source
3
Vous semblez avoir une implémentation non-POSIX de sed(ou peut-être exécutez-vous cette commande à partir d'un shell non-POSIX?). Vous n'avez pas besoin sedcependant, trest assez: tr -d '\\' < P.
Stéphane Chazelas

Réponses:

20

Vous pouvez soit remplacer la barre oblique inverse par un espace comme vous le montrez dans l'exemple de résultat:

sed 's/\\/ /g'

ou vous pouvez le supprimer comme vous le voyez dans votre code:

sed 's/\\//g'

Caractères spéciaux

Il peut y avoir des problèmes avec l'échappement de la barre oblique inverse pour annuler sa signification spéciale. La barre oblique inverse est un caractère spécial utilisé pour s'échapper à la fois dans un shell et dans des expressions régulières.

La commande que vous tapez sur la ligne de commande du shell ou un script est d'abord traitée par le shell qui interprète la signification particulière des caractères et leur échappement. Le résultat est ensuite passé à la commande à exécuter (comme sed) qui effectue sa propre interprétation des caractères. Lorsque vous construisez une commande, la procédure mentale est l'inverse: ajoutez d'abord l'échappement pour l'expression régulière puis ajoutez l'échappement pour le shell.

  1. Dans une expression régulière (entrée de commandes telles que sed, grepetc.), la barre oblique inverse peut être échappée par une barre oblique inverse comme ceci: \\et vous pouvez également utiliser l'expression définie [\]comme vous l'avez utilisée car la barre oblique inverse perd sa signification particulière.

  2. Dans un shell (comme bash), vous pouvez échapper à la barre oblique inverse par barre oblique inverse. Donc au lieu d' \écrire \\. Mettre la chaîne entre guillemets doubles "complique le comportement de la barre oblique inverse <1>, mais la double barre oblique inverse produira toujours une barre oblique inverse simple. Mettre la chaîne entre guillemets simples 'fait que chaque caractère doit être traité littéralement sauf '.

Si vous souhaitez utiliser des guillemets doubles , vous pouvez utiliser l'une des options suivantes:
sed "s/\\\\//g"- Échapez \par \dans le shell, et échappez de nouveau à chaque \expression régulière. En fait, les guillemets doubles ne sont pas nécessaires dans ce cas car chaque caractère spécial est correctement échappé.
sed "s/[\\]//g"- S'échapper dans le shell par une barre oblique inverse \et dans l'expression régulière utiliser un ensemble [ ].
sed "s/[\]//g"- Oui, votre exemple devrait fonctionner dans un environnement compatible POSIX! Entre guillemets doubles se \représente à moins qu'il ne précède un caractère spécial dans le contexte des guillemets doubles: $`"\ou une nouvelle ligne. Il semble que dans votre cas, le shell ou le sedne suit pas la norme POSIX.

Avec des guillemets simples, vous pouvez également utiliser la chaîne comme vous l'avez utilisé ou d'une manière plus courte:
sed 's/[\]//g'
sed 's/\\//g'

pabouk
la source
6

Vous devez échapper à la barre oblique inverse. Essaye ça:

sed 's/\\//g'
jherran
la source
3

Si vous ne voulez pas de solutions sed, essayez avec les commandes suivantes:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11
αғsнιη
la source
2

En awk, je ferais comme ça,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
Avinash Raj
la source
1
sed 's/\\//'

Placez un \avant \comme vous le faites avec la plupart des caractères spéciaux.

Afficher un nom
la source
Vous avez omis le gdrapeau pour une raison inconnue. Cela modifie le comportement de la commande mais une telle modification n'a pas été demandée dans la question. Sinon, votre réponse n'apporte rien de nouveau par rapport aux réponses précédentes.
pabouk