匹配到bash中的多行字符串,但单词边界不起作用

匹配到bash中的多行字符串,但单词边界不起作用,bash,Bash,我正在使用GNUBash版本4.4.19来匹配多行字符串中的一行(我正在从文件中读取) .txt中的文件: abc/def/ bar/foo/x foobar/foo/y foobar/quux/ 在这个文件中,使用类似于^bar/foo/*$的模式,我试图匹配bar/foo/(而不是foobar/foo/y) 但是由于它是一个多行字符串,^和$不会匹配每一行,而是匹配所有字符串。因此,我试图在我的regexp中使用\b(单词边界) 这是我正在尝试的,但它不起作用 in="$(cat in.t

我正在使用GNUBash版本4.4.19来匹配多行字符串中的一行(我正在从文件中读取)

.txt中的文件

abc/def/
bar/foo/x
foobar/foo/y
foobar/quux/
在这个文件中,使用类似于
^bar/foo/*$
的模式,我试图匹配
bar/foo/
(而不是
foobar/foo/y

但是由于它是一个多行字符串,
^
$
不会匹配每一行,而是匹配所有字符串。因此,我试图在我的regexp中使用
\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

bash
使用POSIX.2正则表达式表示
=
(请参见
man 7 regex

。。。后跟“\”的 其中一个字符“^.[$()|*+?{\”(匹配该字符视为 普通字符),后跟任何其他字符(!) (匹配作为普通字符的字符,就像“\”一样) 没有出现(!),或没有其他意义的单个字符 cance(匹配该字符)

而且它们不支持
\b
作为单词边界分隔符

你最好的选择是逐行匹配

ii=( $(< in.txt) )
for l in "${ii[@]}"
do
    [[ "$l" =~ $re ]] && echo "match: $l"
done
ii=($(
Grep的
p
选项支持单词边界
\b
。因此,使用GNU的Grep,您可以:

in="$(cat in.txt)"                                                         
re="\bbar/foo/[^ ]*"                                                            
grep -oP "$re" <<< $in

您可以使用awk匹配想要的行:

awk '/^bar\/foo\/*/{print $0}' input_file

希望这有帮助。

这里的多行字符串是什么意思?你只想让正则表达式匹配
bar/foo/x
对吗?我想让它匹配到一行,但来自多行字符串。很抱歉给你带来混淆。你说的“它不工作”是什么意思.你的意思是没有执行
echo OK
吗?没错。我目前使用
re=[^\b]*${dir}
,但当我尝试将“%b”追加到此操作时,不再匹配。不幸的是,我只需要使用bash regex,因为调用此操作的次数很多。调用外部进程会大大降低速度。我可以使用
re=[^\b]匹配行的开头*bar/foo
但与行的其余部分匹配的运气不太好。:)
awk '/^bar\/foo\/*/{print $0}' input_file