Comme nous le savons tous, sed
est très efficace pour rechercher et remplacer la chaîne, par exemple trouver « a » et le remplacer à « b »: sed 's/a/b/g'
.
Est-il possible de le faire avec une autre commande ou un script shell au lieu de sed
?
Il s'agit d'un système Linux recadré pour TV qui n'a pas la sed
commande. Je dois donc utiliser d'autres commandes ou scripts au lieu desed 's/a/b/g'. –
shell
text-processing
binghenzq
la source
la source
$var=~s/a/b/g
,gsub(/a/,"b",var)
,var.gsub(/a/,'b')
,var.replace(/a/g,'b')
,preg_replace("/a/","b",$var)
,regsub -all a b $var
. À côté de cela, de nombreux outils et langues peuvent également remplacer les chaînes de texte brut. Votre question est donc en quelque sorte large.Réponses:
Oui, il existe différentes façons de procéder. Vous pouvez également utiliser
awk
,perl
oubash
pour effectuer ces activités. En général,sed
c'est probablement l'outil le plus approprié pour effectuer ce type de tâches.Exemples
Disons que j'ai cet exemple de données, dans un fichier
data.txt
:awk
Perl
Édition en ligne
Les exemples ci-dessus peuvent également modifier directement les fichiers. L'exemple Perl est trivial. Ajoutez simplement le
-i
commutateur.Car
awk
c'est un peu moins direct mais tout aussi efficace:Cette méthode crée un sous-shell avec les accolades '{...} `où le fichier y est redirigé via ceci:
Une fois que le fichier a été redirigé dans le sous-shell, il est supprimé puis
awk
exécuté contre le contenu du fichier qui a été lu dans les sous-shells STDIN. Ce contenu est ensuite traitéawk
et réécrit sous le même nom de fichier que nous venons de supprimer, le remplaçant efficacement.la source
sed
pas I. Sed est l'outil approprié pour effectuer des substitutions comme celle-ci, et il demande évidemment de mieux comprendre les rôles de ces outils, donc montrer à quelqu'un ces choses bien que mauvaises, est extrêmement éducatif en montrant les pourquoi. Trop souvent, le ppl dans le savoir dit simplement «ne le fais pas» sans expliquer pourquoi, je le suis. Mais merci d'avoir au moins laissé un commentaire sur les raisons pour lesquelles vous DV.L'alternative classique pour les substitutions d'une seule lettre est la
tr
commande qui devrait être disponible sur à peu près n'importe quel système:tr
est mieux quesed
pour cela en fait car utilisersed
(sans parlerperl
ouawk
) pour des substitutions d'une seule lettre, c'est comme utiliser un marteau pour tuer une mouche.grep
n'est pas conçu pour cela, il ne modifie pas son entrée, il ne fait que la rechercher.Alternativement, vous pouvez utiliser les capacités de substitution de certains shells. Ici en utilisant
ksh
,zsh
ou labash
syntaxe:Nous pourrions vous donner des réponses plus spécifiques si vous expliquiez exactement quel problème vous essayez de résoudre.
la source
${foo//a/b}
?echo "$foo" | sed 's/a/b/i
ou donner une classe de caractères:echo ${foo//[aA]/b}
.Vous pouvez utiliser Vim en mode Ex:
%
sélectionner toutes les ligness
remplacerg
remplacement globalx
sauver et fermerla source
Si vous travaillez avec un fichier plutôt qu'avec un flux, vous pouvez utiliser l'éditeur de texte standard
ed
:Cela devrait être disponible sur n'importe quel * nix. La virgule dans
',s/a/b/g'
indiqueed
de travailler sur chaque ligne (vous pouvez également l'utiliser%
, ce qui sera plus familier si vous êtes habitué à vim), et le reste est une recherche et un remplacement standard.w
lui dit d'écrire (enregistrer) le fichier, luiq
dit de quitter.Notez que, contrairement à l'
-i
option de sed (et aux options similaires dans d'autres outils), cela modifie le fichier sur place plutôt que de tricher avec des fichiers temporaires.Je ne pense pas qu'il soit possible de faire fonctionner cela avec des flux, mais je n'en sais pas vraiment grand-chose
ed
et je ne serais pas surpris s'il a réellement cette capacité (la philosophie Unix étant ce qu'elle est).la source
En utilisant la commande ancêtre ed (dans laquelle
-s
signifie silencieux (silencieux) et la virgule avant les commandes signifie exécuter sur toutes les lignes):Il suffit d'imprimer sur STDOUT :
remplacement en place:
la source