String 查找ampersend&;在字符串中(bash)

String 查找ampersend&;在字符串中(bash),string,bash,escaping,String,Bash,Escaping,我有这个 string=“dontcare noone&11111-&1111-&C00 noone” 我必须提取子字符串&11111-&1111-&C00 从第一个&到第一个空格 我尝试了一些索引和sed,但没有成功 有人提出了一些很好的建议?您可以使用bash的字符串操作功能: $ echo "dontcare noone &11111-&1111-&C00 noone" | grep -o '&[^ ]*' &11111-&1111-&

我有这个 string=“dontcare noone&11111-&1111-&C00 noone”

我必须提取子字符串&11111-&1111-&C00 从第一个&到第一个空格

我尝试了一些索引和sed,但没有成功


有人提出了一些很好的建议?

您可以使用bash的字符串操作功能:

$ echo "dontcare noone &11111-&1111-&C00 noone" | grep -o '&[^ ]*'
&11111-&1111-&C00
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

您可以使用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
使用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、&&和许多其他选项将为您提供将grep与其他命令相结合的方法,以获得您正在搜索的确切输出

我还看到你希望它的第一个“空白”,我刚刚添加到顶部的代码。使用“cut”和delimeter“”只能提取空格后的数据。使用cut的字段设置,可以切换正在拉取的内容。

使用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、&&和许多其他选项将为您提供将grep与其他命令相结合的方法,以获得您正在搜索的确切输出


我还看到你希望它的第一个“空白”,我刚刚添加到顶部的代码。使用“cut”和delimeter“”只能提取空格后的数据。使用cut的字段设置,可以切换正在拉取的内容。

Bash正则表达式也可以工作:

[[ $string =~ (&[[:alnum:]]+-?)+ ]]; echo ${BASH_REMATCH[0]}

正则表达式匹配一个或多个组,其中一个组是一个与,后跟一个或多个字母/数字和可选的最后连字符。如果匹配成功(即[[]]命令的存在状态为0),则数组的第一个元素
BASH\u REMATCH
包含与正则表达式匹配的
string
中的文本。

BASH正则表达式也将起作用:

[[ $string =~ (&[[:alnum:]]+-?)+ ]]; echo ${BASH_REMATCH[0]}

正则表达式匹配一个或多个组,其中一个组是一个与,后跟一个或多个字母/数字和可选的最后连字符。如果匹配成功(即[[]]命令的存在状态为0),然后数组的第一个元素
BASH_REMATCH
包含与正则表达式匹配的
string
中的文本。

您是想提取这个字符串,还是提取任何形式的字符串&number-&number-&whatever?字符串中唯一确定的是以&开头,以空格结尾。我试图使用转义字符,但没有达到我的目标。。现在我来试试larsks的解决方案。你是想提取这个字符串还是任何形式的字符串&number-&number-&whatever?字符串中唯一确定的是以&开头,以空格结尾。我试图使用转义字符,但没有达到我的目标。。现在我来试试larsks的解决方案。这不满足“到第一个空格”的条件。@dbaupp:对不起,我没有注意到这一点;固定现在;谢谢你的评论!这不满足“到第一个空格”的条件。@dbaupp:对不起,没有注意到这一点;固定现在;谢谢你的评论
somefile.txt
将只有一行,grep将使用somefile.txt作为伪文件输出整行。Grep将从第一个空格开始输出整行,除非您也给它字段delimeter;但我不打算把整个代码都交给他,只是给他指出正确的方向,让他自己修改。谷歌本可以为他的问题提供答案,但公平地说,我决定给他一个解释和一些想法,以推动他自己的进步。这绝不是一个悖论的密码;但我们必须推动建设性的流动。我想这就是这个网站的目的。我同意。我真的在“给他指出正确的方向,让他自己修改”谢谢你的解释和时间。
somefile.txt
只有一行,grep将输出整行。对,使用somefile.txt作为虚拟。Grep将从第一个空格开始输出整行,除非您也给它字段delimeter;但我不打算把整个代码都交给他,只是给他指出正确的方向,让他自己修改。谷歌本可以为他的问题提供答案,但公平地说,我决定给他一个解释和一些想法,以推动他自己的进步。这绝不是一个悖论的密码;但我们必须推动建设性的流动。我想这就是这个网站的目的。我同意。我真的在“给他指出正确的方向,让他自己修改”谢谢你的解释和时间。谢谢!它工作得很好$string=“dontcare noone&11111-&1111-&C00 noone”$stringa=“&${string\\\&}”$stringb=“${stringa%%*}”$echo$stringb&11111-&1111-&C00@OdayMansourI也需要字符串的第一部分。。。我这样做是为了求值$(echo“$string”| awk'{split($0,split,\&”);打印“ONE=\”“split[1]”\”;打印“TWO=\\”和“split[2]”\”})和三个“${TWO%%*}”thx!它工作得很好$string=“dontcare noone&11111-&1111-&C00 noone”$stringa=“&${string}*\&}”$stringb=“${stringa%%*}”$echo$str