Ok, considere este arquivo de exemplo:
#!/usr/bin/env bash
cat > example_file.txt <<EOL
group, , price
1, S_BRN_, 3.21
1, S_WBS_BRN_, 4.11
1, S_WBS_BRN, 1.22
2, S_BRN_WBS, 9.2
2, F_WBS_BRN_, 2.11
2, F_BRN_, 2.11
2, F_BRN_WBS_, 2.11
EOL
Quero todas as linhas que contenham a string 'F_BRN_' ou "S_BRN_'. Faço o seguinte sed:
sed -n '/S_BRN_\|F_BRN_/p' example_file.txt
e eu recebo:
1, S_BRN_, 3.21
1, S_WBS_BRN_, 4.11
2, S_BRN_WBS, 9.2
2, F_WBS_BRN_, 2.11
2, F_BRN_, 2.11
2, F_BRN_WBS_, 2.11
minha pergunta é: como evitar correspondências parciais? Por exemplo, F_WBS_BRN_ não contém a substring F_BRN_, portanto, não deve ser retornada.
F_WB S_BRN_ contém a substring S_BRN_ então deve ser retornada pela sua expressão.
Se você quiser combinar strings que começam com S_BRN_ ou F_BRN_ você pode habilitar expressões regulares estendidas usando a opção
-r
ou-E
e usar uma âncora de limite de palavraou mais simplesmente
No seu caso, você também pode corresponder ao espaço antes de S ou F, no entanto, a âncora de limite de palavra tem a vantagem de também corresponder onde não há nenhum caractere anterior específico para ancorar, como no início da linha.
Como alternativa (já que você também marcou a pergunta
awk
), você pode corresponder ao segundo campo delimitado por espaço e usar uma âncora de início de padrão^
: