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

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

abc def\ ghi jkl abc

由 4 个项目组成, abcdef ghijklabc

如果我的一组正则表达式是
b
k$
^g

输出应该是
abc abc

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

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

最佳答案

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

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

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

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

10-07 16:26
查看更多