如何从字符串中获取有效路径?
例如,我有以下文本,file.txt
它将始终使用以下模式以随机路径生成:
Some error occurred. rerun the script with "-d" option and check the output and logfile: /tmp/du_resp_16929.
路径/tmp/du_resp_XXXXX
末尾有随机数(标记为XXXXX)。获取路径的最佳方法是什么?
我知道如何使用 awk 像下面这样来获取字符串的末尾,但有时路径可能位于中间或开头。
awk ‘{print $(NF)}’ file.txt | sed 's/\.$//'
输出:
/tmp/du_resp_16929
因此,我认为上述并不是最好的解决方案。
答案1
grep 选项使用-oP
正则表达式完成该工作/tmp/du_resp_\d+
。
其中\d+
表示 1 位或多位数字。
grep -oP '/tmp/du_resp_\d+' file.txt
/tmp/du_resp_16929
答案2
以下命令将隔离与您的/tmp/du_resp_XXXXX
模式匹配的子字符串:
grep -Eo '/tmp/du_resp_[0123456789]{5}'
笔记:
- 使用 GNU 3.7 测试
grep
。 - 如果一行输入中有很多匹配项,那么您将在单独的输出行中获得每个匹配项。
du_resp_123456
将为您提供du_resp_12345
。替换{5}
为{5,}
以匹配5位或更多数字。[0123456789]
是匹配 ASCII 数字的简单模式。[0-9]
,[[:digit:]]
或\d
不等同于它. 使用您真正想要的那个。
答案3
这里,有些东西适用于您的示例,
但可能需要针对其他形式的内容进行调整:
$ sed < file.txt -re 's,^.* (/tmp/[^ .]+).*,\1,' /tmp/du_resp_16929
根据您生成随机部分(XXXXX)的方式,您可能不仅会得到数字,还会得到其他字符,[^ .]
查找下一个空格或.
字符/tmp/
并停止在那里包含字符。
此正则表达式适用于更多随机名称,例如由创建mktemp
$ for ((i=1; i<5; i++)) ; 执行 mktemp -u /tmp/du_resp_XXXXX ; 完成 /tmp/du_resp_0Mdw6 /tmp/du_resp_D1xlI /tmp/du_resp_EjsZU /tmp/du_resp_cYWB9 $