Uso do awk para procurar por string que contenha caracteres

5

Estou enfrentando uma questão de pesquisar linhas de texto em um arquivo de texto.

Atualmente, estou usando este comando

check='awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt'

Funciona bem quando as strings são caracteres alfabéticos puros. Assumindo que o arquivo de texto contém 3 linhas de string que são

C++ Programming in 21 Days
C## Programming in 21 Days
C Programming in 21 Days

Quando eu fizer uma pesquisa parcial por apenas uma letra C , 3 dos resultados serão exibidos, que é o que eu quero, no entanto, se eu inserir C++ P , meu programa retornará o texto não encontrado. E se eu digitar C++ , todos os 3 resultados serão exibidos também.

Mas o engraçado é que, se eu pesquisar por C## P , meu programa retornará C## Programming in 21 Days encontrado.

Não consigo descobrir o que está causando esse erro. Por favor, ajude.

    
por Zac 11.07.2015 / 22:13

2 respostas

1

O "+" está sendo tratado como uma expressão regular.

$ title="C++ P"
$ awk -F: -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt
C Programming in 21 Days
$ title="C.. P"
$ awk -F: -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt
C++ Programming in 21 Days
C## Programming in 21 Days

Se estiver interessado apenas em corresponder ao início, você pode usar

$ awk -F: -v "title=$title" 'tolower(substr($0,0,length(title))) == tolower(title)' test.txt

Ou para combinar em qualquer lugar dentro da linha

$ title="C"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C++ Programming in 21 Days
C## Programming in 21 Days
C Programming in 21 Days
$ title="C++ P"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C++ Programming in 21 Days
$ title="C## P"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C## Programming in 21 Days
    
por 11.07.2015 / 22:27
5

tolower(title) é tratado como expressão regular:

  • C++ corresponde ao caractere C literalmente (diferencia maiúsculas de minúsculas)

    • Quantificador: ++ Entre um e ilimitado, tantas vezes quanto possível, sem devolver [possessivo]
  • C corresponde ao caractere C literalmente (diferencia maiúsculas de minúsculas)

  • C## corresponde aos caracteres C## literalmente (diferencia maiúsculas de minúsculas)

Para obter o resultado correto para C++ , você precisa do padrão C\+\+

Exemplos

% title="C\+\+"                                                
% awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' foo
C++ Programming in 21 Days

ou menor

% awk '/[Cc]\+\+/' foo 
C++ Programming in 21 Days

% awk '/[Cc]##/' foo  
C## Programming in 21 Days

% awk '/[Cc] /' foo
C Programming in 21 Days

ou com uma variável externa

% title='C## P'
% awk '/'"$title"'/' foo   
C## Programming in 21 Days

% title='C\+\+ P'                        
% awk '/'"$title"'/' foo 
C++ Programming in 21 Days

% title='C\+\+ P'
% check=$(awk '/'"$title"'/' foo) 
% echo $check
C++ Programming in 21 Days

e assim por diante

    
por 11.07.2015 / 22:30

Tags