如何在unix(vi或sed)中使用substitute命令来实现以下结果

如何在unix(vi或sed)中使用substitute命令来实现以下结果,unix,Unix,如何在UNIX(vi或sed)中使用substitute命令来实现以下结果。我的数据是这样的,例如char(10)null,char(20)null,char(11)not null。我想修改一行,该行具有char()和null,而不具有char()和非null。修改后的行应该类似于varchar(10)null整个想法是用var char替换char,字节保持不变,只有null参数 感谢您sed-i“s/char/varchar/”filename.txt在不使用-i选项的情况下测试以下命令,

如何在UNIX(vi或sed)中使用substitute命令来实现以下结果。我的数据是这样的,例如
char(10)null,char(20)null,char(11)not null
。我想修改一行,该行具有
char()
null
,而不具有
char()
非null
。修改后的行应该类似于
varchar(10)null

整个想法是用var char替换char,字节保持不变,只有null参数


感谢您

sed-i“s/char/varchar/”filename.txt

在不使用
-i
选项的情况下测试以下命令,以使其完美。
\(
\)
之间的正则表达式被记住并在
\1
中返回

sed -i 's/char(\([0-9]*\)) not null/varchar(\1) not null/' file

让我重复我的问题有两种情况或两种类型的线。1) abc字符(10)空。2) xyz字符(10)不为空。我只需要改变具有null的行作为参数(行1),如果我遵循你的解决方案,它将改变所有的字符串“char”线,而我需要考虑“char”和“null”的行,而且括号中的字节大小也会变化,所以我不能使用“char(10)”,因为有些将有char(11),char(5)。等等。希望我的问题现在清楚了,这取决于您的数据格式是否良好,1。您可以激活vim交互式搜索并手动替换和决定-:%s/char/varchar/gc 2。尝试将regex与occurrence匹配在命令结尾处禁用“c”标志。这将在每次更换前发出vi/m提示。有关详细信息,请参见“:帮助替换”。但这需要一段时间,因为它是手动的。编辑:看来你删除了你的评论,但我会留下来澄清Regardlessuperb,非常感谢。我使用sed的/(char……null)/var\1/g,每次增加一个点(“.”),以增加每个字节的长度。但您的解决方案是一次性执行。再次感谢。