Хорошо, рассмотрим этот пример файла:
#!/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
Мне нужны все строки, содержащие строку 'F_BRN_' или «S_BRN_». Я делаю следующий sed:
sed -n '/S_BRN_\|F_BRN_/p' example_file.txt
и я получаю:
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
мой вопрос: как предотвратить частичное совпадение? Например, F_WBS_BRN_ не содержит подстроки F_BRN_, поэтому ее не следует возвращать.
F_WB S_BRN_ содержит подстроку S_BRN_, поэтому должно возвращаться вашим выражением.
Если вы хотите сопоставить строки, которые начинаются с S_BRN_ или F_BRN_, вы можете включить расширенные регулярные выражения с помощью переключателя -r
или -E
и использовать якорь границы слова
$ sed -rn '/\b(S_BRN_|F_BRN_)/p' example_file.txt
1, S_BRN_, 3.21
2, S_BRN_WBS, 9.2
2, F_BRN_, 2.11
2, F_BRN_WBS_, 2.11
или проще
sed -rn '/\b[SF]_BRN_/p' example_file.txt
В вашем случае вы также можете сопоставить пробел перед S или F, однако преимущество якоря границы слова заключается в том, что он также сопоставляется там, где нет определенного предшествующего символа для привязки, например, в начале строки.
В качестве альтернативы (поскольку вы также отметили вопрос awk
) вы можете сопоставить второе поле, разделенное пробелом, и использовать якорь начала шаблона ^
:
awk '$2 ~ /^[SF]_BRN_/' example_file.txt