【问题标题】:Sed pattern to match and replace用于匹配和替换的 Sed 模式
【发布时间】:2013-11-05 12:26:13
【问题描述】:

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

Id int

改成

Id string

这将是该行中的唯一内容(仅是 Id int)并且不应更改其他行。

我尝试了一些类似的东西

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

但是正则表达式是错误的。

谢谢。

编辑:

进一步澄清: Id 之前,Idint 之间有空格(不一致)。因此,需要匹配 [[:space:]]* ,而不是制表符或表达式,如 s/^Id int$

所以要匹配的行可以是

   Id int
Id   int
  Id      int

可以换成

Id string
Id string
Id string

表示,不需要保留空格数

【问题讨论】:

  • 为什么这不起作用? sed -i 's/^[ \t]*Id[ \t][ \t]*int[ \t]*$/Id string/'
  • @JerryJeremiah 添加了一些说明。谢谢
  • “Id”是字面意义上的两个字符“Id”,还是您需要在替换中保留的一些未知标识符?
  • Id 只是 2 个字符 Id,不是标识符。
  • @bsr 我发布的解决方案运行良好。

标签: regex bash sed


【解决方案1】:

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

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 之后的空格。如果您不想保留单词之间或最后一个单词之后的空格,请从sed 表达式中删除组匹配参数\2\3

【讨论】:

  • 好吧,我在 ID 前后都有空格。 Id 和 int 之间有空格。所有这些空格都不一致(表示可以是 1、2、..)。
【解决方案2】:

使用 awk 更容易:

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

并且可能更容易根据您的实际需求进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2012-03-07
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多