Awk pour remplacer l'apostrophe
Je veux remplacer tous les include('./
dans un ensemble de fichiers avec include('
. Je suis en train d'utiliser awk comme suit:
awk '{gsub("include\('"'"'./", "include\('"'"'", $0); print > FILENAME}' *.php
Me jette cette erreur.
awk: (FILENAME=xyz.php FNR=1) fatal: Unmatched ( or \(: /include('.//
Toute aide serait appréciée.
est awk un besoin spécifique pour une raison quelconque? Vous devez utiliser sed vraiment.
sed, awk, les deux peuvent faire le travail.
Avez-vous essayé un ici doc? De cette façon, vous n'avez pas à le dérange pas beaucoup à l'échappement
sed -i 's/include(\'.\// include(\'/g' *.php
sed, awk, les deux peuvent faire le travail.
Avez-vous essayé un ici doc? De cette façon, vous n'avez pas à le dérange pas beaucoup à l'échappement
OriginalL'auteur GeekTantra | 2010-02-25
Vous devez vous connecter pour publier un commentaire.
@OP, vous pouvez essayer d'utiliser code octal pour le guillemet simple(
\047
) et une barre oblique(\057
), par exemple,OriginalL'auteur ghostdog74
Cela fonctionne (sans la redirection d'e/S sur "imprimer"):
Il cartes de cette entrée:
:
Empiriquement, il semble que l'expression régulière doit être à l'intérieur des barres obliques; la chaîne de remplacement doit être un habitué de la chaîne. Vous aurez besoin de la carte de la "
.
' à '\.
" pour arrêter le deuxième remplacement.Je ne suis pas très heureux avec cette explication. La page de man pour 'awk' sur MacOS X dit:
Donc, en théorie, la forme d'une chaîne que vous avez utilisé devrait fonctionner. Empiriquement, il n'a pas; j'ai eu sensiblement le même message d'erreur que vous avez fait avec votre code. Et vous aviez eu le shell devis correct, ce qui est non-trivial.
Il ya des moments où Perl peut être plus facile (parce que vous pouvez choisir l'arbitraire d'un délimiteur pour marquer la regex limites):
\(' treated as plain
('c'est là que vous devez utiliser un fichier de script: 'awk -f fichier *.php'. Ensuite, vous n'avez pas à lutter contre la coque de l'interprétation des citations ainsi que des awk interprétation de citations, ce qui rend la vie de tout un tas plus facile. Re avertissement: MacOS 'awk' ne pas le donner, mais la barre oblique inverse devant la parenthèse dans la chaîne de remplacement est non désirées - votre 'awk' est correct.
l'aide de guillemets doubles dans
gsub
a ses utilise. par exemple, si la substitution d'une barre oblique/
, on peut utilisergsub("/","")
au lieu degsub(/\//,"")
OriginalL'auteur Jonathan Leffler
Essayez ceci :
vous avez égaré barre oblique inverse
ou ceci :
comment à ce sujet ?
Avez-vous essayé sans esacping rien
Je n'ai pas de console ou installé awk sur moi .. j'aimerais tester ces exemples ci-dessus ..
Aucun de ces aidé...
c'est parce que awk est écrit dans le fichier que son traitement en même temps. !
OriginalL'auteur ant
Vous n'avez pas besoin d'utiliser
awk
si tout ce que vous voulez faire est de cette. 🙂 Aussi, l'écriture dans un fichier que vous êtes en train de lire, dans la façon dont vous l'avez fait, va conduire à la perte de données ou la corruption, essayez de ne pas le faire.Juste pour clarifier la perte de données d'aspect: quand
awk
(oused
) commencer le traitement d'un fichier et vous demander de lire la première ligne, ils pourront effectuer un tampon de lecture, qui est, ils vont le lire depuis le système de fichiers (nous pouvons simplifier et dire "à partir du disque") d'un bloc de données aussi grands que leurs interne mémoire tampon de lecture (par exemple, 4-65KB) afin d'obtenir de meilleures performances (réduction des e/s disque.) Supposons que le fichier de travail est plus grande que la taille de la mémoire tampon. De plus amples lit continueront à venir à partir de la mémoire tampon jusqu'à ce que le tampon est épuisé, à quel point un second bloc de données sera chargé à partir du disque dans la mémoire tampon etc.Cependant, juste après avoir lu la première ligne, c'est à dire après le premier bloc de données est lu à partir du disque dans la mémoire tampon de votre
awk
script s'ouvreFILENAME
, le fichier d'entrée lui-même, pour l'écriture avec troncature, c'est à dire la taille du fichier sur le disque est remis à 0. À ce stade, tout ce qui reste de votre fichier d'origine sont les premiers kilo-octets de données dansawk
's de la mémoire.Awk
va gaiement continuer à lire ligne après ligne à partir de la mémoire tampon et de produire de sortie jusqu'à ce que le tampon est épuisé, à quel pointawk
sera probablement arrêter et de vous laisser avec un 4-65k fichier.Comme une note de côté, si vous êtes en train d'utiliser awk pour développer (par exemple
print "PREFIX: " $0
), pas de rétrécissement (gsub(/.../, "")
), de données, alors vous aurez presque certainement jusqu'à la fin avec un non réactifawk
et une perpétuellement croissante de fichier. 🙂Sans doute l'un moindre niveau de citer/s'échapper. 🙂 Mais ce qui est vraiment impardonnable partie, selon (awk ou sed) est utilisé, est essentiellement tronquer chaque fichier PHP après la première ligne est lue, c'est à dire si le fichier est plus grand que awk/sed de la mémoire tampon de lecture et il est juste tronqué ses fichiers tout comme le nombre d'octets.
awk fait le travail pour moi. Ce n'est pas sur l'aide de sed ou awk son sur lequel est le plus à l'aise avec.
Correct, awk ou sed va faire le travail. J'espère qu'aucun de vos fichiers de plus de 65k. 🙂 Juste pour le plaisir, de prendre ou de faire un 100K fichier et exécutez l'origine
gawk { ... print > FILENAME } file
de commande. Monawk
s'arrête à plat sur 68k. Ooops. 🙂c'est parce que son écriture dans le fichier que gawk est en cours de traitement. de son le même concept que
cat file > file
. Fournir un nom de fichier différent (et en le renommant en arrière à l'original, si nécessaire) est le chemin à parcourir.OriginalL'auteur vladr