4

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

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

abc def\ ghi jkl abc

由 4 个项目组成,abcdef ghijklabc

如果我的正则表达式是

b
k$
^g

输出应该是

abc abc

似乎grep -f可以让我大部分时间到达那里,但我必须处理一种处理转义空格的方法,所以我不能只做tr从空格到换行的操作。

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

4

2 回答 2

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

输出:

abc
abc
于 2013-06-22T17:36:35.423 回答
1

我真的不明白你的物品是如何提供的。

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

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

警告。这迟早会破裂,除非神秘总是输出像样的东西!

于 2013-06-22T17:26:32.930 回答