【问题标题】:How to use regular expression in sed command如何在 sed 命令中使用正则表达式
【发布时间】:2011-04-23 15:31:06
【问题描述】:

我在一些文件中有一些带有这种模式的字符串:

  • domain.com/page-10
  • domain.com/page-15 ....

我想用类似的东西替换它们

  • domain.com/apple-10.html
  • domain.com/apple-15.html

我发现我可以使用 sed 命令一次替换它们,但是因为在数字之后应该添加一些东西,我想我必须使用正则表达式来做到这一点。但我不知道怎么做。

【问题讨论】:

    标签: regex sed


    【解决方案1】:
    sed -i.bak -r 's/page-([0-9]+)/apple-\1.html/' file
    
    sed  's/page-\([0-9][0-9]*\)/apple-\1.html/' file > t && mv t file
    

    除了sed,还可以使用gawk的gensub()

    awk '{b=gensub(/page-([0-9]+)/,"apple-\\1.html","g",$0) ;print b  }' file
    

    【讨论】:

    • 您没有看到 OP 想要的全部内容。
    • 使用 GNU Sed 扩展 - 可以用标准 sed 编写,将 '+' 替换为 '[0-9]*'。
    • @jonathan,你确定吗? * 为零或更多。 + 是一个或多个。 [0-9] [0-9]* 应该更合适。
    • 是的,所以当 '+' 像我说的那样被替换时,你最终会得到 '[0-9][0-9]*' 这是一个或多个数字 - 并且,如你说,这是合适的(我同意)。
    【解决方案2】:
    sed -i 's/page-\([0-9]*\)/apple-\1.html/' <filename>
    

    ([0-9]*)捕获一组数字;替换字符串引用中的\1 捕获并将其添加为替换字符串的一部分。

    如果您需要保留文件的副本而不进行替换,您可能想要使用类似 -i.backup 的内容,或者只是省略 -i 并改用 I/O 重定向方法。

    【讨论】:

    • 您没有指定如何使用 \d+
    • 谢谢,但我运行了你给定的命令并得到了这个错误:'s' 命令的 RHS 上的无效引用 \1
    • 那是因为你应该避开大括号......看我的第二个答案
    • @ghostdog74 感谢您对转义大括号的回复。我不知道我是否会自己解决这个问题。 :)
    【解决方案3】:

    解决问题的另一种方法:

    sed -i.bak 's/\(^.*\)\(page-\)\(.*\)/\1apple-\3.html/' Files
    

    这里使用引用(\1\2\3)存储和检索搜索模式。

    【讨论】:

      【解决方案4】:

      这会起作用

      sed 's/$/\.html/g' file.txt
      

      【讨论】:

      • sed 's/$/\.html/g' 文件.txt
      猜你喜欢
      • 2012-10-29
      • 2013-08-07
      • 1970-01-01
      • 2020-05-21
      • 2022-11-16
      • 1970-01-01
      • 2020-10-11
      相关资源
      最近更新 更多