首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash (可能会使用perl/python):通过正则表达式过滤空格分隔的arg列表

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

Stack Overflow用户
提问于 2013-06-23 01:14:32
回答 2查看 120关注 0票数 4

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

我希望这些项目能够有空格在他们将被转义。所以:

代码语言:javascript
复制
abc def\ ghi jkl abc

由4个项目组成:abc、def ghi、jkl和abc。

如果我的正则表达式集合是

代码语言:javascript
复制
b
k$
^g

输出应为

代码语言:javascript
复制
abc abc

看起来grep -f可以帮我解决大部分问题,但是我必须处理转义空格,所以我不能只做一个从空格到换行符的tr。

编辑:我想我可以使用sed来做一个转义空格感知的换行符替换常规空格。在换行符返回的过程中,tr就足够了。不知道有没有人有更好的主意。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-23 01:26:33

我真的不明白你的物品是怎么给的。

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

代码语言:javascript
复制
gniourf@somewhere$ mystery
abc def\ ghi jkl abc

您可以(文件myscript):

代码语言:javascript
复制
#!/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[@]}"

出于测试目的,我这样做:

代码语言:javascript
复制
#!/bin/bash
# file mystery
echo 'abc def\ ghi jkl abc'

然后(在chmod +x mystery myscript之后):

代码语言:javascript
复制
gniourf@somewhere$ ./mystery
abc def\ ghi jkl abc
gniourf@somewhere$ ./mystery | ./myscript
abc abc

注意事项。这迟早会被打破,除非神秘感总是能输出像样的东西!

票数 1
EN

Stack Overflow用户

发布于 2013-06-23 01:36:35

我认为它可以在bash本身中处理,而不需要任何外部实用程序。

首先将字符串放入数组中:

代码语言:javascript
复制
input=(abc 'def ghi' jkl abc)

然后运行这个for循环,根据提供的regex验证您的输入:

代码语言:javascript
复制
for i in "${input[@]}"; do
    for r in 'b' 'k$' '^g'; do
       [[ "$i" =~ $r ]] && echo $i && break
    done
done

输出:

代码语言:javascript
复制
abc
abc
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17253294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档