2010-10-11 118 views
0

我有一些字符串,在一些文件这种模式:如何使用正则表达式sed命令

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

,我想的东西,如

  • domain.com/apple-10.html
  • 来取代它们
  • domain.com/apple-15.html

我发现我可以使用sed命令在同一时间,以取代他们,但因为之后的数字应该的东西可以添加我想我必须使用正则表达式做到这一点。但我不知道如何。

回答

6
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 
+0

您没有看到OP所需的全部内容。 – Amber 2010-10-11 04:52:56

+0

使用GNU Sed扩展 - 可以用标准sed来写入,用'[0-9] *'替换'+'。 – 2010-10-11 04:55:33

+0

@jonathan,你确定? '*'为零或更多。 '+'是一个或多个。 ''[0-9] [0-9] *'应该更合适。 – ghostdog74 2010-10-11 04:59:46

5
sed -i 's/page-\([0-9]*\)/apple-\1.html/' <filename> 

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

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

+0

您没有指定如何使用\ d + – ghostdog74 2010-10-11 04:54:42

+0

感谢,但我运行给出的命令和得到这个错误:在'S'命令的RHS – 2010-10-11 05:01:10

+1

那是因为你无效引用\ 1应该逃避大括号...看到我的第二个答案 – ghostdog74 2010-10-11 05:03:34

0

另一种方式来解决这个问题:

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

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

-1

这将工作

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

sed的/ $/\。html/g'file.txt – 2016-09-22 06:56:00