J'ai besoin d'une commande sed regex qui affichera chaque ligne dans un moment qui se termine par 'html', et ne commence PAS par 'a'.
Mon code actuel fonctionnerait-il?
sed 's/\[^a]\*\.\(html)\/p' text.txt
3 Réponses :
Sed complique un peu les choses ... vous pouvez utiliser grep pour gérer cela facilement!
cat file | tr -d '\n' ' ' //It converts all newlines into a space!
sont fonctionnellement équivalents.
ou
pipe input | xargs -n1 egrep "^[^a].+\.html$" > text.txt //xargs -n1 means take the stdin from the pipe and read it one line at a time in conjunction with the single command specified after any other xargs arguments // ^ means from start of line, //. means any one character //+ means the previous matched expression(which can be a //(pattern group)\1 or [r-ange], etc) one or more times //\. means escape the single character match and match the period character //$ means end of line(new line character) //egrep is short for extended regular expression matches which are really
sympa (en supposant que vous n'utilisez pas de pipe ou de cat, etc.)
Vous pouvez convertir un fichier délimité par une nouvelle ligne en une seule ligne d'entrée avec cette commande:
egrep "^[^a].+\.html$" -f sourcefile > text.txt //loads file from within the program egrep egrep "^[^a].+\.html$" < sourcefile > text.txt //Converts stdin file descriptor with the input redirect //to sourceFile for this stage of the` pipeline
Quoi qu'il en soit, soyez créatif avec des utilitaires simples et vous pouvez faire beaucoup de choses:
xargs, grep, tr sont un bon combo facile à apprendre. Sans la séduction de tout cela.
Ne faites pas cela avec sed. Faites-le avec deux appels différents à grep
grep -v ^a file.txt | grep 'html$'
Le premier grep récupère toutes les lignes qui ne commencent pas par "a", et envoie la sortie de celle-ci dans le second grep, qui extrait toutes les lignes qui se terminent par "html".
Quel est l'avantage de le faire avec un tuyau alors qu'il peut s'agir d'une seule expression?
Parce qu'il peut être plus facile de comprendre que les choses se décomposent en morceaux distincts.
La commande sed
serait
grep '^[^a].*html$'
Mais la commande canonique pour imprimer les lignes correspondantes est grep
:
sed -n '/^[^a].*html$/p'
Que faire si la ligne ne contient que html
?
Bienvenue dans Stack Overflow. Je pense que cette commande ne fonctionnera pas. Mais voici une bonne approche: essayez d'écrire une commande qui imprime chaque ligne qui ne commence pas par «a», et une autre commande qui imprime chaque ligne qui se termine par «html». Chacun de ces éléments est beaucoup plus facile que votre problème actuel, et une fois que vous les avez tous les deux, il vous sera facile de les combiner.
Pourquoi
sed
est-il obligatoire? Cela fait-il partie d'un programmesed
plus large? Modifiez-vous le code existant? Plus de contexte nous permettra de fournir de meilleures réponses.