Encontre o número da linha que contém o padrão usando o delimitador personalizado regex

6

Como em exemplo Estou tentando obter números de linha que contenham o padrão. Meu padrão contém barras, então quis adicionar um delimitador personalizado.

Este simples funciona:

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

Usar o delimitador para substituição de string também funciona:

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

mas quando quero adicionar um delimitador ao primeiro exemplo, não:

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

Eu sei que posso escapar de barras, mas prefiro adicionar um delimitador personalizado. Alguma ideia de como consertar meu comando?

    
por jasiustasiu 30.01.2015 / 15:06

2 respostas

6

Stéphane deu-lhe a sed solution:

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

Se você está aberto para usar outras ferramentas, você também pode fazer

grep -n 'file /etc' file

Isso também imprimirá a própria linha, para obter apenas o número da linha:

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

Ou você pode usar perl :

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

Ou awk :

awk '$0 ~ "file /etc" {print NR}'
    
por 30.01.2015 / 15:32
3

Em todos os endereços de contexto, você precisa escapar do delimitador abertura , a menos que esteja usando o padrão / . Quaisquer ocorrências seguintes que são escapadas são tratadas como o caractere literal, não como o delimitador final.

  • delimitador padrão:

    /start/,/end/{/pattern/d;}
    
  • delimitador personalizado:

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

Veja os documentos POSIX :

In a context address, the construction \cREc where c is any character other than a backslash or newline character, is identical to /RE/ If the character designated by c appears following a backslash, then it is considered to be that literal character, which does not terminate the RE. For example, in the context address \xabc\xdefx, the second x stands for itself, so that the regular expression is abcxdef.

Descrição similar no GNU sed man page:

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

e FreeBSD sed man page:

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''.
    
por 05.04.2015 / 20:49