我有这个 string="dontcare noone &11111-&1111-&C00 noone"
我不得不将子字符串 &11111-&1111-&C00 从第一个 & 提取到第一个空白
我已经尝试了一些索引和一些 sed,但没有任何运气。
有人有一些很好的建议吗?
您可以使用 bash 的字符串操作功能:
string="dontcare noone &11111-&1111-&C00 noone"
# remove everything up to the first "&"
string="&${string#*&}"
# remove everything from the end to the earliest blank
string="${string%% *}"
# ta da!
echo $string
&11111-&1111-&C00
$ echo "dontcare noone &11111-&1111-&C00 noone" | grep -o '&[^ ]*'
&11111-&1111-&C00
Bash 正则表达式也可以工作:
[[ $string =~ (&[[:alnum:]]+-?)+ ]]; echo ${BASH_REMATCH[0]}
正则表达式匹配一个或多个组,其中一个组是一个&符号,后跟一个或多个字母/数字和一个可选的最后连字符。如果匹配成功(即 [[ ]] 命令的存在状态为 0),则数组的第一个元素BASH_REMATCH
包含string
与正则表达式匹配的文本。
使用 grep。
echo "dontcare noone &11111-&1111-&C00 noone" > somefile.txt
grep somefile.txt -e "&" | cut -d " " > someotherfile.txt
grep 基本上会“cat”输出并搜索模式,用 -e 实例化,然后用 & 拉出字符串
> 会将输出推送到您已经拥有的文件中,或者只是在那里命名,然后它会创建它。
然后,您可以随时覆盖 somefile.txt,或附加字符串。
老实说,有很多方法可以做到这一点。grep 是搜索特定字符串时更好的选择之一,但即便如此,您已经可以在这个问题中看出有很多很多方法来 grep 事物。
管道,| ; and's、&& 和许多其他选项将为您提供将 grep 与其他命令结合使用的方法,以获得您正在搜索的确切输出。
我还看到你想要它到我刚刚添加到顶部代码的第一个“空白空间”。使用“cut”和“”分隔符,您只能提取空格后的数据。使用 cut 的字段设置,可以切换正在拉取的内容。