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 的文件名)
我的问题很简单,但我想我漏掉了什么地方,
我想提取以下字符串的路径:"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 的文件名)