在bash中匹配多行字符串,字边界不起作用

时间:2018-05-28 04:23:41

标签: bash

我正在使用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

3 个答案:

答案 0 :(得分:0)

llbash使用 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

希望这有帮助。