Comment trouver des lignes commençant par **

8

J'ai besoin de savoir si des lignes d'un fichier commencent par **.

Je ne peux pas comprendre comment le faire, car il *est interprété comme un caractère générique par le shell.

grep -i "^2" test.out

fonctionne si la ligne commence par un 2 mais

grep -i "^**" test.out 

ne fonctionne évidemment pas.

(J'ai également besoin de savoir si cette ligne se termine par un )mais je n'ai pas encore tenté cela).

Shar Hunter
la source

Réponses:

18

Utilisez le \personnage pour échapper au * pour en faire un personnage normal.

grep '^\*\*' test.out

Notez également le guillemet simple 'et non le guillemet double "pour empêcher le shell de développer les choses

Stephen Harris
la source
3
Le premier *n'a pas besoin de s'échapper dans ce cas particulier, fwiw.
don_crissti
5
Bien qu'il ne soit pas nécessaire de l'échapper, ne pas échapper au premier astérisque sera plus déroutant pour un observateur occasionnel, comme si vous correspondiez à "n'importe quel nombre de débuts de lignes suivis d'un astérisque". Tout ce qui rend une expression rationnelle plus intuitive pour un responsable est une bonne idée. =)
Compilateur remarquable
1
L'utilisation de guillemets doubles empêcherait également l'expansion, pas seulement les guillemets simples. Mauvais conseils ici.
rems4e
@ rems4e utilisant des guillemets doubles empêcherait le shell d'étendre les astérisques, mais pas d'interpréter les barres obliques inverses. Avec des guillemets doubles, vous devez utiliser grep "^\\*\\*"afin que grep reçoive la ^\*\*chaîne dont il a besoin pour éviter d'interpréter les astérisques comme des quantificateurs d'expressions régulières.
Aaron
7

Comme vous vouliez vérifier la ligne qui commence **et se termine par ), vous pouvez combiner deux grepopérations comme celle-ci,

grep '^*\*' test.out | grep ')$'

Ou avec une seule grepcommande comme celle-ci,

grep -E '^\*\*.*\)$' test.out

Explication

  • ^\*\* : ligne de correspondance commençant par **
  • .* : tout correspondre après **
  • \)$: correspond à la ligne qui a également )en fin de ligne.
Rahul
la source
3

Ce n'est pas la coquille

Jusqu'à présent, aucune des réponses n'a abordé le vrai problème. Il serait utile d'expliquer pourquoi cela ne fonctionne pas comme prévu.

grep -i "^**" test.out

Parce que vous avez cité le modèle à grep , *n'est pas développé par le shell. Il est transmis à grep tel quel . Ceci est expliqué dans la page de manuel [1] pour bash [2] :

Mettre des caractères entre guillemets conserve la valeur littérale de tous les caractères entre guillemets, à l'exception de $, `, \ et, lorsque l'expansion de l'historique est activée,!.

Ce sont des expressions régulières ordinaires ordinaires

Une expression régulière est un modèle qui décrit un ensemble de chaînes.

*est l'un des modèles clés des expressions régulières. Par défaut, grep l' interprète comme suit:

* The preceding item will be matched zero or more times.

Cela signifie que votre modèle en l'état ^**n'a pas beaucoup de sens. Il essaie éventuellement de faire correspondre le début de la ligne zéro ou plusieurs fois , deux fois. Quoi que cela signifie.

La solution est de le citer :

Tout méta-caractère ayant une signification particulière peut être cité en le précédant d'une barre oblique inverse.

grep -i "^\*\*" test.out


[1] Je ne recommande pas de le lire. Veuillez utiliser man dashou similaire à la place.

[2] Aucun shell n'a été donné, donc je suppose que bash .

tuyau
la source
2

Autres options.

Vous pouvez utiliser sedou awkaussi

$ sed -n '/^*\*/p' test.out
$ awk '/^*\*/' test.out

Pour connaître les lignes qui se terminent par une )utilisation également grepou sedouawk

$ grep ')$' test.out
$ sed -n '/)$/p' test.out
$ awk '/)$/' test.out
tachomi
la source
Merci tout le monde ! J'apprécie vraiment l'aide sur celui-ci!
Shar Hunter
1
Et la ligne combinée awk: '/^*\*/&&/)$/'...
jasonwryan
0

Ceci est la version complètement unquoted: grep ^\\*\\* test.out. Pour passer une barre oblique inverse littérale du shell à grep, il faut l'échapper.

Cela fonctionne tant que vous n'avez aucun fichier dans le répertoire commençant par ^\et contenant une autre barre oblique inverse.

Beat Bolli
la source