【问题标题】:Prepend to regex match在正则表达式匹配之前添加
【发布时间】:2009-08-30 15:33:42
【问题描述】:

我在 bash 脚本中有一个需要替换的变量。该行中唯一的常量是它将以“_(*x)xxxp.mov”结尾。其中 x 是数字,长度可以是 3 或 4。例如,我知道如何替换该值,但前提是它是一个常量:

echo 'whiteout-tlr1_1080p.mov' | sed 's/_[0-9]*[0-9][0-9][0-9]p.mov/_h1080p.mov/g'

如何将正则表达式匹配转移到替换行?

编辑:

好的,我刚刚了解到 grep 只能打印匹配项,这样做会更好吗?

urltrail=$(echo $@ | grep -o [0-9]*[0-9][0-9][0-9]p.mov)
newurl=$(sed 's/$urltrail/h$urltrail/g')

嗯,尝试了上述方法,但我遇到了问题。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    Back Reference

    sed 's/_\([0-9]*[0-9][0-9][0-9]\)p.mov/_h\1p.mov/g'
    

    反向引用\n(其中n 是一个数字)匹配先前与正则表达式的nth 括号子表达式匹配的子字符串。

    【讨论】:

    • 伊恩说得好。很高兴了解 sed 和正则表达式以及它们可以做什么。感谢您的帮助。
    【解决方案2】:

    您没有将旧路径导入 sed,因此 sed 挂起等待输入。

    newurl=$(echo $@ |sed 's/$urltrail/h$urltrail/g')
    

    【讨论】:

    • 这将搜索锚定在行尾之后的文字“urltrail”。您可以使用双引号并执行 sed "s/$urltrail...",但这会打开一个完全不同的蠕虫罐(例如,如果 $urltrail 包含空格或 '/' 或其他正则表达式元字符。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2014-03-14
    • 2016-06-14
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多