我需要从字符串中提取路径。我在另一篇文章中找到了示例,但是缺少其他步骤。
我有一个如下字符串:
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
答案 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'