【问题标题】:escaping tool for sedsed 转义工具
【发布时间】:2013-03-23 11:48:36
【问题描述】:

我的日常生活很艰难,我必须手动修补数以千计的文件,而且我有 80% 的时间都在编写用于修补文件的 sed 正则表达式。

所以例如我有一行代码:

"    Limit("POST", "*", ".*", 1000, PER_MINUTE),"

我已经在某个特定的地方注入了某个文件,所以我为此使用了 sed:

limits_py=/my/path/limits.py
sed -i "s/\ \ \ \ Limit(\"POST\",\ \"\*\",\ \"\.\*\",\ 10,\ PER_MINUTE),/\ \ \ \ Limit(\"POST\",\ \"\*\",\ \"\.\*\",\ 1000,\ PER_MINUTE),/" ${limits_py}

我真的厌倦了为每个代码字符串手动编写 sed 正则表达式。

所以问题:如何从字符串生成 sed?

例如,这样的事情将是一种幸福:

echo 'someclass.somemethod("some_argument") # blah blah my comment here' > sed_generator --replace

为 sed “调整”每一行真的很烦人。有什么工具可以解决这个问题吗?甚至更好的diff'ing 两个文件并为每个差异生成 sed 正则表达式替换?也许没有正则表达式可以sed?

【问题讨论】:

  • 只有我一个不明白你在说什么吗?
  • 编辑了一个问题。不明白的话可以随便问。
  • 你已经知道 sed。使用 sed 为您生成 sed :-) 如果您厌倦了引用问题,请转向更强大的语言,例如 Perl。
  • 你为什么要逃离这些空间?
  • 因为当你转义代码时很难说有多少空格,但即使我在编写 php 代码时,我们总是会转义空格..

标签: regex sed


【解决方案1】:

首先,尝试:

s|\(["*]\)|\\\1|g

(注意括号中的特殊字符列表,目前只有"*。)

这会变

"    Limit("POST", "*", ".*", 1000, PER_MINUTE),"

进入

\"    Limit(\"POST\", \"\*\", \".\*\", 1000, PER_MINUTE),\"

在“before”行和“after”行上运行,将结果与s|...|...|一起粘贴,你会得到:

s|\"    Limit(\"POST\", \"\*\", \".\*\", 1000, PER_MINUTE),\"|\"    Limit(\"POST\", \"\*\", \".\*\", 10, PER_MINUTE),\"|

将一个变成另一个。一旦你得到这个工作(你可能需要更多的特殊字符,比如&$),我们可以进行改进,比如从文件中读取“之前”和“之后”行。 (我不确定您为什么要区分两个文件并针对每个差异执行此操作 - 为什么不直接用另一个文件覆盖一个文件?)

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2013-04-05
    • 2021-12-10
    • 2010-09-14
    • 2013-06-18
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多