Trouvez le numéro de ligne qui contient le model en utilisant un délimiteur d'expressions rationnelles personnalisé

Comme dans l' exemple, j'essaie d'get des numéros de lignes qui contiennent le model. Mon model contient des barres obliques alors je voulais append un délimiteur personnalisé.

Ce simple fonctionne:

sed -n '/file/=' temp.txt 

L'utilisation du délimiteur pour replace la string fonctionne aussi:

 sed 's|file|gile|' temp.txt 

mais quand je veux append un délimiteur au premier exemple, il ne le fait pas:

 sed -n '|file /etc|=' temp.txt 

Je sais que je peux échapper des barres obliques, mais je préférerais append un délimiteur personnalisé. Une idée comment réparer ma command?

Stéphane vous a donné la solution sed :

 sed -n '\|file /etc|=' file 

Si vous êtes ouvert à l'utilisation d'autres outils, vous pouvez également le faire

 grep -n 'file /etc' file 

Cela va également imprimer la ligne elle-même, pour get le numéro de ligne seul essayer:

 grep -n 'file /etc' file | cut -d: -f 1 

Ou, vous pouvez utiliser perl :

 perl -lne 'm|file /etc| && print $.' file 

Ou awk :

 awk '$0 ~ "file /etc" {print NR}' 

Dans toutes les adresses de context, vous devez échapper au délimiteur d' ouverture , sauf si vous utilisez le paramètre par défaut / . Toutes les occurrences suivantes échappées sont traitées comme le caractère littéral et non comme le délimiteur de fin.

  • Délimiteur par défaut:

     /start/,/end/{/pattern/d;} 
  • délimiteur personnalisé:

     \#start#,\#end#{\#pattern#d;} 

Voir les documents POSIX :

Dans une adresse de context, la construction \ cREc où c est un caractère autre qu'un caractère antislash ou un caractère de nouvelle ligne est identique à / RE / Si le caractère désigné par c apparaît après une barre oblique inverse, on considère que ce caractère littéral ne met pas fin à l'ER. Par exemple, dans l'adresse de context \ xabc \ xdefx, le second x représente lui-même, de sorte que l'expression régulière est abcxdef.

Description similaire dans la page sed man GNU sed man :

 /regexp/ Match lines matching the regular expression regexp. \cregexpc Match lines matching the regular expression regexp. The c may be any character. 

et page sed man FreeBSD:

 In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression. The opening delimiter needs to be preceded by a backslash unless it is a slash. For example, the context address \xabcx is equivalent to /abc/. Also, putting a backslash character before the delimiting character within the regular expression causes the character to be treated literally. For example, in the context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is ``abcxdef''.