我正在使用GNU bash, version 4.4.19
来匹配多行字符串中的一行(我正在从文件中读取)。
档案in.txt
:
abc/def/
bar/foo/x
foobar/foo/y
foobar/quux/
在此文件中,使用^bar/foo/.*$
之类的模式,我正在尝试匹配bar/foo/
(而不是foobar/foo/y
)。
但由于它是一个多行字符串,^
和$
将不匹配每一行,而是所有字符串。因此,我试图在我的正则表达式中使用\b
(单词边界)。
这就是我正在尝试的但它不起作用。:
in="$(cat in.txt)"
re=\\bbar/foo/.*\\b
[[ "$in" =~ $re ]] && echo OK
我尝试过的其他模式并没有起作用:
re=\bbar/foo/.*\n
re=\\bbar/foo/.*\\n
re=\\bbar\/foo\/.*\\b
re=\\bbar\/foo\/.*\\n
re=\\bbar\/foo\/\(.*\)\\n
答案 0 :(得分:0)
ll
对bash
使用 POSIX.2正则表达式(参见=~
),如此处所述
... a'\'后跟 其中一个字符是“^。[$()| * +?{\”(匹配该字符作为 一个普通的角色),'\'后跟任何其他角色(!) (将该角色与普通角色相匹配,就像'\' 没有出现(!)),或没有其他意义的单个角色 - 取消(匹配该字符)。
并且他们不支持man 7 regex
作为单词边界分隔符。
您最好的选择是逐行匹配
\b
答案 1 :(得分:0)
Grep的P
选项支持字边界\b
。所以使用GNU的grep你可以做到:
in="$(cat in.txt)"
re="\bbar/foo/[^ ]*"
grep -oP "$re" <<< $in
输出结果为:
bar/foo/x
答案 2 :(得分:0)
您可以使用awk匹配所需的行:
awk '/^bar\/foo\/*/{print $0}' input_file
希望这有帮助。