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

时间:2018-08-14 02:04:36

标签: 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

输出为

/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL kdlkfg nsfgf trhrnrt

我只需要

/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL

需要进行哪些修改?

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

2 个答案:

答案 0 :(得分:4)

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

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

$ title="/${title#*/}"
$ title="${title%% *}"
$ echo "$title"
/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL

第一行删除了直到第一个斜杠为止的所有内容(同时在斜杠之前替换了被剥离的那个”,第二行删除了剩余的第一行空白中的所有内容。

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

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

正则表达式翻译为:

  • 该行开头为空
  • 零个或多个非斜杠
  • 一个原子:
    • 斜杠后跟非空格字符
  • 一个空格,以结束上一个原子。

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

下一个选项可能是grep -o

$ grep -o '/[^ ]*' <<<"$title"

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

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

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

$ sed 's:^[^/]*::;s/ .*//' <<<"$title"

此功能与仅在sed脚本中通过参数扩展(在答案顶部)处理的功能相同,该脚本需要调用外部程序。仅用于修脚。 :)

答案 1 :(得分:2)

请您尝试以下。

echo "$title" | awk 'match($0,/\/.*\/[^ ]*/){print substr($0,RSTART,RLENGTH)}'

输出如下。

/rlsmodules/svnrepo/SOURCE/CBL/MQ/BASELINE/MQO000.CBL

解决方案2nd: :考虑到您的变量的值之间没有空格,因此跟随操作也可能会有所帮助。

echo "$title" | awk '{sub(/[^/]* /,"");sub(/ .*/,"")} 1'