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).
text-processing
grep
quoting
Shar Hunter
la source
la source
*
n'a pas besoin de s'échapper dans ce cas particulier, fwiw.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.Comme vous vouliez vérifier la ligne qui commence
**
et se termine par)
, vous pouvez combiner deuxgrep
opérations comme celle-ci,Ou avec une seule
grep
commande comme celle-ci,Explication
^\*\*
: ligne de correspondance commençant par**
.*
: tout correspondre après**
\)$
: correspond à la ligne qui a également)
en fin de ligne.la source
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] :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: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 :
grep -i "^\*\*" test.out
[1] Je ne recommande pas de le lire. Veuillez utiliser
man dash
ou similaire à la place.[2] Aucun shell n'a été donné, donc je suppose que bash .
la source
Autres options.
Vous pouvez utiliser
sed
ouawk
aussiPour connaître les lignes qui se terminent par une
)
utilisation égalementgrep
oused
ouawk
la source
'/^*\*/&&/)$/'
...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.la source