从bash shell脚本中的整个字符串中提取路径

Dwi*_*ija 1 linux string bash shell

我需要从字符串中提取路径。我在另一篇文章中找到了示例,但缺少其他步骤。

我有一个字符串如下:

title="test test good dskgkdh hdfyr /rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL kdlkfg nsfgf trhrnrt"
cobsrc=$(awk '{match($0,/\/[^"]*/,a);print a[0]}' <<< $title)
echo $cobsrc
Run Code Online (Sandbox Code Playgroud)

输出是

/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL kdlkfg nsfgf trhrnrt
Run Code Online (Sandbox Code Playgroud)

我只需要

/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL
Run Code Online (Sandbox Code Playgroud)

需要什么修改?

关于类似查询的现有帖子: how to extract path from string in shell script

gho*_*oti 5

四种解决方案,按照我自己的喜好排序。

第一个选项是简单的参数扩展,分两步:

$ title="/${title#*/}"
$ title="${title%% *}"
$ echo "$title"
/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL
Run Code Online (Sandbox Code Playgroud)

第一行删除了第一个斜杠之前的所有内容(同时添加了一个斜杠来替换被剥离的那个”,第二行从剩下的第一位空格中删除了所有内容。

或者,如果您愿意,也可以使用正则表达式:

$ [[ $title =~ ^[^/]*(/[^ ]+)\  ]]
$ echo ${BASH_REMATCH[1]}
/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL
Run Code Online (Sandbox Code Playgroud)

正则表达式翻译为:

  • 行首为空,
  • 一串零个或多个非斜线,
  • 一个原子:
    • 斜杠后跟非空格字符
  • 一个空格,结束前一个原子。

该$BASH_REMATCH数组包含括号内原子的内容。

下一个选项可能是grep -o:

$ grep -o '/[^ ]*' <<<"$title"
Run Code Online (Sandbox Code Playgroud)

(结果已编辑 - 你知道它会是什么。)

您当然可以使用您已经知道的命令替换将此输出分配给变量。

最后一个选择是另一个外部工具......

$ sed 's:^[^/]*::;s/ .*//' <<<"$title"
Run Code Online (Sandbox Code Playgroud)

这与仅在 sed 脚本中由参数扩展(在答案顶部)处理的功能相同,它需要调用外部程序。仅包含用于迂腐。:)