sed在特定行上搜索并替换另一个号码

问题描述 投票:0回答:2

我想替换多个转储文件(* .sql):

`this_pattern` varchar(255)

通过

`this_pattern` varchar(100)

即仅当线上存在“this_pattern”时。

我试过简单的:

echo "varchar(255)" | sed -e 's/\(255\)/100/g'

但我不知道如何把this_pattern条件。

sed "/^`this_pattern`/ s/\(255\)/100/g"

什么也没做。

谢谢你的帮助。

sed
2个回答
0
投票

试试这个,使用捕获组( )

$ cat file
`this_pattern` varchar(255)
varchar(255)

$ sed -E '/^`this_pattern`/ s/(varchar)\(255\)/\1(100)/g' file
`this_pattern` varchar(100)
varchar(255)

0
投票
echo 'this_pattern varchar(255)' | sed '/^this_pattern.*/ s/varchar(255)/varchar(100)/g'

没有-r开关,sed将圆形的parens视为字符。

如果this_pattern被反引号掩盖,就像在原始帖子中那样,它有点复杂,但看起来并不合理。但是,我们走了:

echo '`this_pattern` varchar(255)' | sed '/^`this_pattern` .*/ s/varchar(255)/varchar(100)/g'
`this_pattern` varchar(100)

注意:'pattern'和'varchar'和'varchar'和'('等等)之间可能存在变量空格。所以你必须要小心。有时,这是一次性的工作,有几十行,有时候这是一个重复的工作。有时输入具有通用性,并且预期总是看起来相同,有时它是人造的,并且可能不时地有所不同。在进行大量更新时,你必须考虑到这一点。

保留源的副本通常是个好主意。通常编辑者允许使用正则表达式,可以进行大规模重命名,但是它们会标记这些位置,以便您可以监视将要进行的更改。

© www.soinside.com 2019 - 2024. All rights reserved.