Sed模式匹配和替换

时间:2013-11-05 03:30:31

标签: regex bash sed

如何编写一个sed表达式,它通过一行来匹配

Id int

并改为

Id string

这将是该行中唯一的内容(除了Id之外),不应该改变其他行。

我尝试了一些事情

find . -type f -print0 | xargs -0  sed -i '' 's~^\([[:space:]]*\)"Id"[[:space:]]*"int"[:space:]]*$~\1"Id string"~g'

但是reg exp错了。

感谢。

编辑:

进一步澄清: 在Id之前,Idint之间存在空格(不一致)。因此,需要匹配[[:space:]] *,而不是像s/^Id int$

这样的制表符或表达式

所以匹配的行可以是

   Id int
Id   int
  Id      int

可以替换为

Id string
Id string
Id string

表示无需保留空格数

2 个答案:

答案 0 :(得分:0)

我相信以下内容可以满足您的需求:

sed 's/^Id int$/Id string'

^表示行的开头$表示行的结尾,因此我们将更改限制为仅限行包含Id int,而不是I like Id int

OP澄清后更新:

如果你想匹配有不同空格的情况,并保留这个空格,你可以使用:

sed 's/^\([[:space:]]*\)Id\([[:space:]]+\)int\([[:space:]]*\)$/\1Id\2string\3/'

这将保留Id之前,Idint之间以及int之后的空白。如果您不想保留单词之间或最后一个单词之后的空格,请从\2期限中删除组匹配参数\3sed

答案 1 :(得分:0)

使用awk更容易:

awk '$2=="int"{$2="string"}1'

可能更容易调整您的实际需求。