好的,考虑这个示例文件:
#!/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
开关启用扩展正则表达式并使用单词边界锚或更简单地说
在您的情况下,您也可以匹配 S 或 F 之前的空格,但是单词边界锚的优点是也匹配没有特定的前导字符可锚定的位置,例如在行首。
或者(因为您还标记了问题
awk
)您可以匹配第二个以空格分隔的字段,并使用模式开始锚^
: