在bash中我有一个字符串,并希望得到包含某个子字符串的部分(分隔符是空格字符)。像我一样
LIST="some string with a substring you want to match"
我的子串是“ubst”。我想要返回字符串“substring”。 (如果有多个匹配,它应该返回匹配的第一个子字符串。)
字符串的部分是编译器标志。所以它们可以包含特殊字符(但没有空格)。
答案 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
。