grep -f <(sed 's/.*/\^&\>/' town-list.txt) ma-towns.txt
Explicação:
grep -f file
lê file
para uma lista de padrões para correspondência. Estamos pesquisando na lista ma-towns.txt
, usando padrões de town-list.txt
. Cada linha separada é tratada como um novo padrão, ou seja, um novo termo de pesquisa.
No entanto, isso não é o suficiente, então incluímos um sed
para formatar os termos de pesquisa assim:
^Acton\>
^Adams\>
^Agawam\>
O ^
faz o grep corresponder apenas a esse padrão no início de uma linha, e o \>
faz o grep corresponder apenas se a palavra terminar nesse ponto.
Juntos, isso garante que o termo de pesquisa apenas analise o início da linha (onde estão os nomes das cidades) e que o termo de pesquisa termine onde o nome da cidade termina.
O comando sed executa o comando s
(substitute), na forma s/search/replace/
.
O termo de pesquisa .*
corresponde a uma linha inteira. A substituição, \^&\>
, substitui-a por um caracter literal ^
, seguida pela linha original, seguida pelo texto \>
.
O que esta resposta faz que a outra não:
- Manipula nomes de cidades começando com um traço ou contendo barras invertidas (o que é improvável, mas se a entrada for tirada de um usuário, você não deseja que eles sejam capazes de quebrar seus scripts de maneiras imprevisíveis). Note que ambas as respostas tratam nomes de cidades como um regex em vez de um termo de pesquisa literal.
- Mostra as cidades na ordem original, conforme especificado em ma-towns.txt
- Executa melhor
- Pesquisa o início da linha para o nome da cidade, não apenas em qualquer lugar na linha
- Não corresponde a uma cidade se apenas uma correspondência de substring (por exemplo,
Waterloo
não corresponder aWaterlooville
)