bash(可以使用perl / python):通过正则表达式过滤空格分隔的arg列表

时间:2013-06-22 17:14:32

标签: linux bash unix

我有一组正则表达式,应该针对空格分隔列表中的每个项目进行测试。

我希望这些项目能够在其中包含将被转义的空格。所以:

abc def\ ghi jkl abc

包含4个项目,abcdef ghijklabc

如果我的正则表是

b
k$
^g

输出应为

abc abc

似乎grep -f可以帮助我完成大部分工作,但是我必须处理一种处理转义空间的方法,所以我不能只从空间到换行符tr

编辑:我想我可以使用sed进行转义空间感知,将常规空格替换为换行符。在从换行符回来的路上,tr就足够了。想知道是否有人有更好的想法。

2 个答案:

答案 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 总是输出不错的东西!