获取包含给定子字符串的字符串的一部分

时间:2016-01-15 21:06:58

标签: regex string bash

在bash中我有一个字符串,并希望得到包含某个子字符串的部分(分隔符是空格字符)。像我一样

LIST="some string with a substring you want to match"

我的子串是“ubst”。我想要返回字符串“substring”。 (如果有多个匹配,它应该返回匹配的第一个子字符串。)

字符串的部分是编译器标志。所以它们可以包含特殊字符(但没有空格)。

6 个答案:

答案 0 :(得分:3)

使用awk你可以这样做:

str="some string with a substring you want to match"
awk -v s='ubst' -v RS=' ' '$0 ~ s' <<< "$str"
substring
  • -v RS=' '会将记录分隔符设置为空格,从而将每个空格分隔的单词分成单个记录。
  • $0 ~ s会在字词与您指定的搜索字词匹配时返回该字词

PS:如果您只想打印第一场比赛,请使用:

awk -v s='ubst' -v RS=' ' '$0 ~ s{print; exit}' <<< "$str"

如果想要单个grep,那么只需要进行学术练习,然后使用此PCRE正则表达式:

grep -oP '^(?:(?!\w*ubst).)*\K\w*ubst\w*' <<< "$str"

答案 1 :(得分:2)

只使用grep和-o和head:

echo "${LIST}" | grep -oe '[^ ]*ubst[^ ]*' | head -n 1

答案 2 :(得分:1)

使用tr和grep

echo "${LIST}" | tr " " "\n" | grep -m1 ubst

答案 3 :(得分:1)

as_ref(&self) -> Option<&T>

答案 4 :(得分:1)

[[条件总是有内置的 regex 运算符:

str="some string with a substring you want to match"
a=( $(echo "$str") )
for i in "${a[@]}"; do
    [[ "$i" =~ "ubst" ]] && printf "%s\n" "$i"
done

您也可以使用符合POSIX的expr string : regex表达式:

[ $(expr "$i" : ".*ubst.*") -gt 0 ] && printf "%s\n" "$i"

答案 5 :(得分:1)

awk -v RS='[ \t]'  '!/ubst/{next}1'

说明

正如你所说

  

(分隔符为空格字符)

字符串可以被分解为记录,然后只匹配包含ubst的记录。

LIST="some string with a substring you want to match"

echo "$LIST" | awk -v RS='[[:blank:]]'  '!/ubst/{next}1'

嗯,实际上,如果记录与ubst不匹配,则转到next记录 匹配的任何记录都属于默认1,这意味着print