如何从bash中的字符串中获取子字符串

时间:2018-01-03 23:58:19

标签: bash

我有哈希问题

我必须将子字符串带到特定字符串的字符串

例如,如果我有

"adgj    fghsjekoe     ===   / gghhj"

我必须从" /"中获取字符串,在这种情况下

"/ gghhj"

但我不知道真正的位置,我只知道我必须从"/"

我可以使用哪个命令?我必须使用c u t?但我不知道使用什么选项。我需要一个可以将字符串从"/"剪切到字符串末尾的命令。

感谢

5 个答案:

答案 0 :(得分:1)

使用GNU sed:

echo 'adgj fghsjekoe === / gghhj' | sed 's|.*/|/|'

输出:

/ gghhj

答案 1 :(得分:0)

另一种可能的sed解决方案:

$ echo "foo/bar" | sed 's#[^/]*##'
/bar

如果您在变量中包含字符串,则还可以在启用parameter expansion的情况下使用extglob。参数扩展的优点在于它由bash

处理
$ shopt -s extglob        #enables extglob
$ var="foo/bar"
$ echo "${var##*([^/])}"
/bar
$ echo "${var/*([^\/])}"  #another possible expansion
/bar

如果输入中没有/,则所有解决方案都不会打印任何内容(我希望这是所需的行为)。

答案 2 :(得分:0)

您可以通过参数扩展来使用shell的内部工具本身。

val="adgj fghsjekoe === / gghhj"  ##Taking your string into a variable called val here.
echo ${val#*= }  ##Removing the value till `= ` by parameter expansion here.

输出如下。

/ gghhj

答案 3 :(得分:0)

对于这么简单的事情,我认为sed有点矫枉过正,有一个专门的cut命令:

echo "your string /..." | cut -d '/' -f 2

-d参数指定用于剪切字符串的字符,在我们的示例中,您要剪切/-f参数指定您想要的字段,从1开始。请注意,您可以执行-f 2-之类的奇特之处(即字段2和以下内容)等。

答案 4 :(得分:0)

您正在使用bash,因此您可以使用子字符串替换进行参数扩展。这使用shell本身并避免产生调用实用程序的附加子shell,例如

$ var="adgj    fghsjekoe     ===   / gghhj"
$ echo "${var/*\//\/}"
/ gghhj

子字符串替换的格式为${var/find/replace},只需find替换replace ${var//find/replace}find将所有replace替换为/ }}

注意:)在查找和替换的实际\/之上进行转义,例如'/'将其指定为文字'/',而不是参数扩展形式)

您也可以在案例中使用参数扩展和子字符串删除。 (尽管你需要先见之明,在结果前加上${var#*/},你将要删除)。例如,要将 left 中的字符串修剪为特定字符(此处为正斜杠),您可以使用" gghhj"。然而,这只会让您只有/,但只需在扩展前添加$ var="adgj fghsjekoe === / gghhj" $ echo "/${var#*\/}" / gghhj 前缀即可取代您删除的那个,例如。

'/'

注意:此处,由于子字符串删除表单中没有/,因此无需转义[[:blank:]] < / p>