Сед настаивает на выполнении частичных совпадений

Хорошо, рассмотрим этот пример файла:

#!/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_, поэтому ее не следует возвращать.

0
задан 5 December 2020 в 15:48

1 ответ

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
2
ответ дан 5 December 2020 в 12:57

Другие вопросы по тегам:

Похожие вопросы: