我有一组正则表达式,应该针对空格分隔列表中的每个项目进行测试。
我希望这些项目能够在其中包含将被转义的空格。所以:
abc def\ ghi jkl abc
包含4个项目,abc
,def ghi
,jkl
和abc
。
如果我的正则表是
b
k$
^g
输出应为
abc abc
似乎grep -f
可以帮助我完成大部分工作,但是我必须处理一种处理转义空间的方法,所以我不能只从空间到换行符tr
。
编辑:我想我可以使用sed
进行转义空间感知,将常规空格替换为换行符。在从换行符回来的路上,tr
就足够了。想知道是否有人有更好的想法。
答案 0 :(得分:2)
我认为它可以在没有任何外部实用程序的情况下在bash中处理。
首先将字符串放在数组中:
input=(abc 'def ghi' jkl abc)
然后运行此for循环以根据提供的正则表达式验证输入:
for i in "${input[@]}"; do
for r in 'b' 'k$' '^g'; do
[[ "$i" =~ $r ]] && echo $i && break
done
done
<强> OUTOUT:强>
abc
abc
答案 1 :(得分:1)
我真的不明白你的物品是如何给予的。
假装它们来自程序 mystery 的输出,在一行中,例如,
gniourf@somewhere$ mystery
abc def\ ghi jkl abc
你可以(提交 myscript ):
#!/bin/bash
output=()
re=( 'b' 'k$' '^g' ) # array of your regexes
read -a a
for w in "${a[@]}"; do
for r in "${re[@]}"; do
if [[ $w =~ $r ]]; then
output+=( "${w// /\\ }" ) # replace space with backslash-space
break
fi
done
done
echo "${output[@]}"
出于测试目的,我做了这个:
#!/bin/bash
# file mystery
echo 'abc def\ ghi jkl abc'
然后(在chmod +x mystery myscript
之后):
gniourf@somewhere$ ./mystery
abc def\ ghi jkl abc
gniourf@somewhere$ ./mystery | ./myscript
abc abc
买者。这迟早会破裂,除非 mystery 总是输出不错的东西!