J'ai ce fichier:
sometext1{
string1
}
sometext2{
string2
string3
}
sometext3{
string4
string5
string6
}
Je veux rechercher dans ce fichier une chaîne spécifique et tout imprimer avant cette chaîne jusqu'à l'ouverture {
et tout après cette chaîne jusqu'à la fermeture }
. J'ai essayé d'y parvenir avec sed mais si j'essaie d'imprimer tout dans la gamme /{/,/string2/
par exemple sed imprime ceci:
sometext1{
string1
}
sometext2{
string2
sometext3{
string4
string5
string6
}
Si je recherche la chaîne "string2", j'ai besoin que la sortie soit:
sometext2{
string2
string3
}
Merci.
text-processing
sed
rodrigo
la source
la source
grep -n '' <infile | sed ...
. Lessed
commandes devront être modifiées; en particulier les bits d'/
adresse/
qui recherchent^
des ancres haut de gamme. Donc, si vous utilisiez ma réponse que vous pourriez probablement faire:grep -n '' | sed 'H;/{$/h;/^[^:]*:}/x;/{\n.*PATTERN/!d'
. Toutes les lignes de sortie seront préfixées avec les numéros de ligne du fichier d'origine suivis de deux points comme1:sometext1{\n2:string1
et ainsi de suite.sed
filtrera uniquement ce qu'il filtrerait auparavant, sauf que chaque ligne de sortie s'ouvre avec un numéro.Réponses:
Voici deux commandes. Si vous voulez une commande qui coupe jusqu'à la dernière
.*{$
ligne d'une séquence (comme le fait @don_crissti aveced
), vous pouvez faire:... qui fonctionne en ajoutant chaque ligne à l'
H
ancien espace à la suite d'un\n
caractère de ligne électronique, en écrasant l'h
ancien espace pour chaque ligne qui correspond{$
, et en échangeant lesh
espaces anciens et de modèle pour chaque ligne qui correspond^}
- et ainsi vider son tampon.Il n'imprime que les lignes qui correspondent à
{
puis à une ligne\n
électronique, puisPATTERN
à un moment donné - et cela ne se produit que immédiatement après un échange de tampon.Il supprime toutes les lignes d'une série de
{$
correspondances à la dernière de la séquence, mais vous pouvez obtenir toutes ces inclusions comme:Ce qu'il fait est de permuter le motif et les
h
anciens espaces pour chaque...{$.*^}.*
séquence, ajoute toutes les lignes de la séquence à l'H
ancien espace après un\n
caractèreD
ewline et se termine jusqu'au premier\n
caractère ewline apparaissant dans l'espace modèle pour chaque cycle de ligne avant de recommencer avec ce qui reste.Bien sûr, la seule fois où il obtient une ligne
\n
électronique dans l'espace de motif, c'est lorsqu'une ligne d'entrée correspond^}
- la fin de votre plage - et donc lorsqu'elle réexécute le script à toute autre occasion, elle tire simplement la ligne d'entrée suivante par habitude.Quand
PATTERN
est trouvé dans le même espace de motif qu'une ligne\n
électronique, cependant, il imprime le lot avant de l'écraser à^}
nouveau (afin qu'il puisse mettre fin à la plage et vider le tampon) .Compte tenu de ce fichier d'entrée (merci don) :
Les premiers tirages:
...et le deuxième...
la source
}
. Cela pourrait être bénéfique pour ...open{\nsub;\n{ command; }\n}; close
- mais je ne suis pas sûr que ce soit le cas ici ...{...}
blocs? Si c'est le cas et que vous utilisez la première solution, vous pouvez le faire/{$/,/^}/H
au début au lieu de simplementH
. Mais si vous avez également essayé la deuxième solution et que vous rencontrez toujours la même erreur, il est peu probable que cela aide, car celle-ci le fait déjà. Et ne remettez pas noned
plus. don a une très bonne réponse ici, eted
peut également être utilisé pour utiliser des fichiers tampons temporaires très simplement, ce qui devrait empêcher les dépassements de tampon mem.Voici une solution avec
ed
:C'est:
Cela suppose qu'il n'y a qu'une seule ligne
PATTERN
entre chaque paire,{
}
sinon vous obtiendrez une sortie en double pour chaque ligne supplémentaire à l'PATTERN
intérieur du même bloc.Cela fonctionnera pour plusieurs
{
}
contenant une seule ligne correspondantPATTERN
par exemple pour un fichier de test avecPATTERN
dans deux sections différentes:fonctionnement
les sorties:
la source
Avec
pcregrep
:Ou avec GNU à
grep
condition que l'entrée ne contienne pas d'octets NUL:la source
où:
string4
-> chaîne à associert1.txt
-> contient le contenu du fichier mentionné dans la requêtela source
sed -n '/ string / p' nom de fichier
le -n lorsqu'il est ajouté au comportement par défaut de sed a supprimé sed cette déclaration peut ne pas vous donner exactement ce que vous voulez mais elle devrait juste déplacer la chaîne
la source