Question

J'ai un problème avec commande de remplacement.

fichier d'entrée i ai cette

{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}

Je veux remplacer par des guillemets simples

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

La commande mentionné ci-dessous

find input.txt -exec sed 's/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'/g' {} \;

J'obtiens l'erreur comme ceci

bash: syntax error near unexpected token `('
Était-ce utile?

La solution 4

Enfin je l'ai trouvé moyen simple de le faire.

input.txt cat sed « s / {a [$ 1] = a [$ 1] FS $ 2} END {for (i in a) i imprimer, a [i]} / {a [1 $] = a [ $ 1] FS $ 2} END {for (i in a) i imprimer, a [i]} / g "

J'espère utile

Autres conseils

Tout d'abord, vous ne pouvez pas insérer facilement une citation littérale unique dans un argument qui est délimité par des guillemets simples.
Vous devez remplacer votre ' est avec '"'"' ou '\''.
Comme un soupçon de deviner ce problème, ici, la plainte vient de la coquille, ce qui signifie que même votre commande en ligne est malformé.

En second lieu, vous devez savoir que dollar et entre parenthèses sont des caractères spéciaux dans les expressions régulières sed. Vous aurez probablement à leur échapper. Lire man sed pour plus de détails à ce sujet.

Troisièmement, je ne suis pas sûr que find input.txt fonctionnera. Je suppose que vous vouliez dire find . -type f -name input.txt?

Il est parce que le ' nu dans votre chaîne de remplacement se termine en fait la commande sed, ce qui signifie le shell tente de traiter la ligne. Ce fait est devenu immédiatement évident lorsque l'édition de Benoit a causé votre question correctement syntaxe couleur. Vous pouvez voir la deuxième ' sur la ligne (le premier caractère du texte de substitution) a changé la couleur du rouge au noir en raison de la terminaison de chaîne.

En outre, sed ne sera pas comme l'utilisation de [] nus car ils indiquent les classes de caractères dans les expressions régulières.

Vous pouvez résoudre les deux problèmes suivants:

pax> find input.txt -exec sed 's/{a\[$1\]=a\[$1\]FS$2}END{for(i in a) print i,a\[i\]}/\x27{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}\x27/g' {} \;

qui sorties:

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

Donc, fondamentalement, échapper les crochets dans la chaîne de recherche afin qu'ils sont traités comme des littéraux et l'utilisation \x27 dans la chaîne de remplacement au lieu de '.

Je trouve ça drôle pourquoi vous devriez avoir à faire cela. Vous devez écrire le code correct en premier lieu, puisque je peux voir son code awk. Ne me dites pas que vous omettez délibérément la citation unique dans votre fichier input.txt lors de sa création? Et son seul fichier que vous modifiez. Il n'y a pas besoin d'utiliser trouver. (À moins que vous ne savez pas où il est).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top