使用sed和bash中的正则表达式从字符串中提取匹配项

时间:2017-12-03 19:39:52

标签: regex bash sed

在bash中,我想获取文件夹路径中最后一个文件夹的名称。

例如,给定../parent/child/,我想要"孩子"作为输出。

使用bash以外的语言,此正则表达式可用.*\/(.*)\/$ works

这是我在bash中的一次尝试:

echo "../parent/child/" | sed "s_.*/\(.*?\)/$_\1_p"

这给了我错误:

sed: -e expression #1, char 17: unterminated `s' command

我有什么不明白的?

2 个答案:

答案 0 :(得分:1)

您的脚本存在的一个问题是"s_.*/\(.*?\)/$_\1_p"内部$_被shell解释为变量名称。 您可以用双引号替换双引号,也可以转义$

一旦修复,.*?可能会或可能不会与sed的实施一起使用。写一些大致相当于更广泛支持的内容会更加健壮,例如:

sed -e 's_.*/\([^/]*\)/$_\1_'

请注意,我删除了p的{​​{1}}标记,以避免两次打印结果。

最后,一个更简单的解决方案是使用sed命令。

basedir

最后,使用参数扩展也可以使用本机Bash解决方案:

$ basename ../parent/child/
child

答案 1 :(得分:0)

你也可以使用剪切

cout <<s[n+2]