J'ai besoin d'aide pour définir le modèle correct pour grep. J'ai besoin de trouver toutes les occurrences de pattern
où la ligne peut avoir espace (s). Par exemple: Dans le fichier suivant:
1. No pattern recognized.
2. Pattern to be recognized
3. Pattern to be recognized here also
4. pattern with only one leading space
Je voudrais grep seulement les lignes 2,3 et 4. Les numéros de ligne sont juste pour la référence.
Jusqu'ici j'ai essayé ce qui suit:
grep -i '^ [[:blank:]]pattern'
, mais il ne renvoie que la ligne 4.
grep -i '[[:blank:]]pattern'
renvoie 1,3 et 4.
grep -i '^[[:blank:]]pattern'
renvoie 1,3 et 4.
- Mike P.S. S'il ne s'agit pas du forum approprié, merci de me guider en conséquence.
Vos lignes 2 et 3 ont la lettre majuscule P et ne nécessitent pas d’espace ou plus, précisez donc exactement cela:
$ grep '[[:blank:]]*Pattern' input.txt
Pattern to be recognized
Pattern to be recognized here also
Personnellement, je recommanderais d’étendre votre motif avec autre chose, comme '[[:blank:]]Pattern.*recognized'
Ce que je comprends, c'est que vous ne voulez pas d'espace de début, comme la ligne 2, ou plus d'un espace, car vous excluez la ligne 4 qui n'a qu'un seul espace.
alors je suggère:
egrep -i '^\s*pattern' file.txt | grep -v '^\spattern'
ou en utilisant un seul awk
:
awk 'tolower($0) ~ /^\s*pattern/ && !/^\spattern/ ' file.txt
\s
comme espace, vous pouvez le changer avec blank
si vous le souhaitez.egrep -i '^\s*pattern' file.txt
d'abord nous commençons toutes les lignes avec ou sans temps précédant l'espace suivant le motif.grep -v '^\spattern'
: alors nous excluons ceux qui contiennent exactement un espace de tête.L'exemple ci-dessus fonctionne sur un fichier sans numérotation, si votre fichier contient les premiers chiffres, utilisez celui-ci:
egrep -i '\s*pattern' file.txt | grep -v '\spattern'
ou pour awk
:
awk 'tolower($0) ~ /\s*pattern/ && !/\spattern/ ' file.txt