匹配到bash中的多行字符串,但单词边界不起作用
我正在使用GNUBash版本4.4.19来匹配多行字符串中的一行(我正在从文件中读取) .txt中的文件匹配到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
:
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