Como grep uma string que contém espaços e quebras de linha

0

Eu queria saber se é possível usar o comando grep para escolher uma string que contenha espaços e quebras de linha, por exemplo:

Hello
I
am
here right now

Eu ainda sou muito novo para regexps e usando a linha de comando em geral (este é meu segundo dia de aprendizado disso), então minha tentativa foi esta:

grep H[\s\S]*w <filename>

Eu achei que [\ s \ S] daria a você qualquer caractere, incluindo espaços e quebras de linha (ao contrário de.), mas não funcionou.

Eu uso o terminal no meu Mac OS (não tenho certeza se isso faz diferença).

    
por Dominique 10.05.2018 / 01:20

2 respostas

0

grep funciona em linhas, então "você não pode fazer isso" ; mas, quando eu preciso fazer algo assim em bash , e eu não quero / não posso usar perl ou similar (ou, honestamente , Eu só quero usar grep ) Eu faço algo assim:

tr '\n' '\a' < <filename> | grep --only-matching Hello$'\a'I$'\a'am$'\a'here\ right\ now | tr '\a' '\n'

tr traduz caracteres; aqui, você está 'traduzindo' novas linhas para bell ascii char [código hexadecimal \ x07 ou '\ a'] , então processe em grep (note que grep vê uma longa cadeia de uma linha, com caracteres de bell ascii em vez de nova linha chars), e então, de volta para 'normal', traduzindo bell ascii chars para nova linha .

não há necessidade de usar bell ascii char : você pode usar qualquer caractere que não apareça no seu arquivo; no meu caso, é só que eu gosto do número sete e, geralmente, um arquivo de texto não contém nenhum caracter bell ascii chars

BTW: o $'\a' é Bash ANSI-C Citando

    
por 10.05.2018 / 02:00
0

Tente isto:

sed -e '1h;2,$H;$!d;g' -re 's/(.*)(H\w+\n)(.*w\n)(.*)//' test.txt

Com um arquivo test.txt contendo:

Something 
Hello
I
am
here right now
Something else

Testado com sed (GNU sed) 4.4 . Você pode instalar o GNU sed no macOS via Homebrew Sed padrão no macOS é BSD sed, algumas opções são ligeiramente diferentes.

Felicidades,

    
por 10.05.2018 / 03:55