char范围的子串

时间:2010-08-16 11:32:08

标签: bash

10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv

如何在每个和_

之间获取字符串

如aaa bbb

4 个答案:

答案 0 :(得分:1)

Pure Bash:

string="10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv"

IFS=','                        # separator for splitting
array=( ${string#*,} )         # split string after the first comma
array=( ${array[@]%%_*} )      # delete trailing '_*' for each element

echo -e "${array[@]}"          # gives 'aaa bbb'

答案 1 :(得分:0)

下面是一个例子

echo "10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv" | grep -o ",[^_]*_"

好吧,上面的命令将在输出中包含','和'_' 要排除这种情况,您可以使用

echo "10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv" | pcregrep -o "(?<=,).*?(?=_)"

传递给pcregrep的正则表达式(?<=,).*?(?=_)使用'pbegrep'支持的正则表达式的'lookbehind'和'lookahead'技术扮演重要角色

答案 2 :(得分:0)

$ s="10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv"
$ echo $s|tr "_" "\n"|sed -n '/,/s/.*,//p'
aaa
bbb

答案 3 :(得分:0)

如果您要求的是纯粹的Bash解决方案,即您不想调用外部程序,您可以尝试这样的事情:

str=10.11.183.81,aaa_XXX150.csv,bbb_YYYY_20100807.csv

while [[ "$str" =~ "," ]]; do
    str=${str#*,}
    echo ${str%%_*}
done

输出是:

aaa
bbb

只要字符串中至少有一个剩余的逗号,就会执行while循环。然后第一行从字符串左侧删除所有字符,直到并包括第一个逗号,第二行打印字符串,排除从第一个下划线到字符串末尾的所有内容。

请注意,原始字符串($ str)已被修改。