3

我无法获得一个简单的正则表达式替换来使用 sed。这是我面临的例子。

我正在尝试替换文件中的行,如下所示:

select * from mytable where mytable.s_id=274
select * from mytable where mytable.s_id=275
select * from mytable where mytable.s_id=276
select * from othertable where othertable.id=?
select * from table3 where table3.name=?

对此:

select * from mytable where mytable.s_id=?
select * from mytable where mytable.s_id=?
select * from mytable where mytable.s_id=?
select * from othertable where othertable.id=?
select * from table3 where table3.name=?

我现在正在使用 sed:

cat log | sed 's/where mytable\.s_id=[0-9]+/where mytable.s_id=/g' | sort

但是我在 sed ( 's/where mytable\.s_id=[0-9]+/where mytable.s_id=/g') 中使用的正则表达式并没有取代任何东西。

我正在阅读尽可能多的文档,但是我阅读的所有内容都不同,做事方式不同,所以我有点迷茫。使用 sed 进行正则表达式替换的规范方法是什么,在我的特殊情况下会是什么样子?

注意:我简化了我面临的问题。我确实想使用 sed(最终学会使用它)并且我确实想通过管道传输输入和输出(而不是就地编辑文件),因为我使用的命令行实际上比这更复杂。

4

4 回答 4

3

引用+

sed 's/where mytable\.s_id=[0-9]\+/where mytable.s_id=?/g'
于 2012-08-28T08:46:32.053 回答
3
cat log | sed 's/where mytable\.s_id=[0-9]\+/where mytable.s_id=?/g'

只是 + 之前的反斜杠。

于 2012-08-28T08:49:17.073 回答
1

AFAIK,一些 sed 不知道+. 因此,试试这个:

 cat log | sed 's/where mytable\.s_id=[0-9]*/where mytable.s_id=?/g' | sort

编辑:这+是一个 GNU 扩展,如果你使用它(并且你的 sed 知道它)你必须逃避它,就像 choroba 建议的那样。

于 2012-08-28T08:45:42.880 回答
1

如果您对 awk 感兴趣

awk -F= '{$2="=?";print}' temp

在下面测试;

> cat temp
select * from mytable where mytable.s_id=275
select * from mytable where mytable.s_id=276
select * from othertable where othertable.id=?
select * from table3 where table3.name=?
> awk -F= '{$2="=?";print}' temp
select * from mytable where mytable.s_id =?
select * from mytable where mytable.s_id =?
select * from othertable where othertable.id =?
select * from table3 where table3.name =?
于 2012-08-28T08:57:31.620 回答