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

时间:2018-02-27 21:55:05

标签: sed

我想替换多个转储文件(* .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"

什么都没做。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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'和'('等等)之间可能存在变量空格。所以你必须要小心。有时,这是一次性工作,有几十个线条,有时它是一个重复的工作。有时输入具有通用性,并且预期总是看起来相同,有时它是人造的,并且可能不时地有所不同。在进行大量更新时,你必须考虑到这一点。

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