sed 使用正则表达式提取字符串的末尾

sed extract the end of a string with regex

我的问题很简单,但我想我漏掉了什么地方,

我想提取以下字符串的路径:"rm -rf /tmp/foo /tmp/bar"

我试过了:

echo "rm -rf /tmp/foo" | sed 's/rm (-[A-Za-z]* )*\(.*\)//'

我希望结果 :

/tmp/foo

我在 AIX 上,但没有 GNU 扩展选项

谢谢

您需要对括号进行转义。

echo "rm -rf /tmp/foo" | sed 's/rm \(-[A-Za-z]* \)*\(.*\)//'

在 BRE 中,如果您不转义括号,它会将 () 视为文字符号。

echo "rm -rf /tmp/foo" | sed -r 's/rm (-[A-Za-z]* )*(.*)//'

你有两个匹配组,第一个匹配 -rf,第二个匹配 /tmp/foo

有两种方法可以更新您的命令, 删除第一个匹配组
要么 将 </code> 更改为 <code>

如果你需要一些安全感and/or宽容

YourSource \
 | sed 's#^[[:blank:]]*rm\([[:blank:]]\{1,\}-[[:alpha:]]\{1,\}\)*[[:blank:]]\{1,\}/#/#
        t
        s/^/#/'

假设:

  • 开始路径前没有 /(例如:在 -e 参数中)
  • 您的文件 FQN 以 / 开头(似乎是 /tmp 文件夹所以没问题)
    • 您可以根据实际需要将第一个 /#/# 更改为 \([^$[:cntrl:]]-[:blank:]]\)## 之类的东西

增加了安全性:

  • 如果第一次替换没有完成(没有模式匹配),输出是原始的但前面有一个 # 因为使用具有 rm -fr 的字符串总是有点危险无法正常工作(在这种情况下,例如带有 space 的文件名)