Sed 坚持进行部分匹配

Sed 坚持进行部分匹配

好的,考虑这个示例文件:

#!/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 -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_,因此不应返回。

答案1

前侧斯伯瑞恩包含子字符串 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

相关内容