2013-06-22 19 views
4

我有一组正则表达式,应该根据空格分隔列表中的每个项目测试一组正则表达式。bash(潜在地可以使用perl/python):通过正则表达式过滤空格分隔的arg列表

我希望这些物品能够在其中有空间,这些物品将被转义。所以:

abc def\ ghi jkl abc 

包括4个项目,abcdef ghijklabc

如果我的设置正则表达式的是

b 
k$ 
^g 

输出应该是

abc abc 

好像grep -f可以让我最那里的方式,但我必须处理的方式来处理逃脱的空间,所以我不能只是从空间到换行做一个tr

编辑:我想我可以使用sed做一个逃脱空间意识到替换正常空间换行。从换行符开始,tr就足够了。想知道是否有人有更好的想法。

+0

如何你的物品是给定的?他们是在一个字符串,一个数组,用户给出,从一个文件中取出......? –

+0

你可以这样做的一种方式是用非可分隔的空格(UTF-8字符)替换所有的空格,这样它们就不会匹配空格正则表达式。一旦你结束了,用一个固定的空间替换不可拆分的空间。有点骇人听闻,但可能是一个简单的方法来解决。 – zmo

+0

它来自STDIN。从一个程序中(从管道) –

回答

1

我真的不明白你的物品是如何给出的。

假装他们来自一个程序神秘的输出,在一个行,例如,

[email protected]$ 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):

[email protected]$ ./mystery 
abc def\ ghi jkl abc 
[email protected]$ ./mystery | ./myscript 
abc abc 

买者。这个迟早会破发,除非神秘总是输出体面的东西!

+0

哦,很好。本地bash循环做bash正则表达式。这是合法的! –

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 
+0

应该可能在内部循环中有一个'break',所以如果匹配多个正则表达式,那么你不会回显相同的输入两次。 – Barmar

+0

@Barmar:很好,非常感谢。我在inner for loop中添加了break。 – anubhava

+0

@StevenLu:我想补充1点。如果由于某种原因,你在'abc \ def \ xyz''这个地方得到'escaped space'字符串,那么你可以使用:'“$ {str // \\ /}”'在填充时去掉所有反斜杠输入数组。 – anubhava