假设我有一个包含 2 行的文件,名为文件.txt:
Row 1: 80 is a nice number
Row 2: 80 is a cool number
Row 3: 80 is a piquant number
Row 4: 80 is a sexy number
我这样做了sed -i 's/80/8080/g'
,但错误地运行了两次,所有行的结果80808080
都是8080
.
我相信这在普通技术中很可能是不可能的,但我仍然想问是否有一种复杂的方法可以使其sed
仅对该文件产生一次影响。我的意思是,某种“锁定”可以避免发生此类错误,例如sed
在文件中多次运行此错误,直到我删除该锁定。当处理更长的行时,尤其是大量的行时,这可能(我强调“可能”这个词)很有帮助。
这并不是一个真正的问题,我应该避免这样的错误,仅此而已,但我很好奇是否有人尝试开发一些技术“防御机制”来避免此类sed
错误。
awk
注意:我相信类似的解决方案也对用户有帮助。
答案1
这不是很复杂,但它是一种防御机制,当用包含自身的字符串替换字符串时,会添加前一个和/或下一个字符以防止重复替换。
根据上面的示例,我推荐以下一项(或两项):
sed -i 's/ 80 / 8080 /g'
sed -i 's/^80 /8080 /g'
另外,要小心-i
:)
答案2
只是不要用于-i
就地编辑,尤其是当您正在尝试某些内容或开发某些脚本时。相反,始终写入临时文件。然后检查该文件是否正常,并可能用它替换原始文件。
该-i
选项是非标准的,并且在sed
实现之间非常不可移植。
更改文件的便携式方法sed
是
sed 'expression' file >newfile && mv newfile file
awk
没有同样的问题。awk
GNU都不mawk
支持nawk
就地编辑(这实际上并不是人们经常想要做的事情),因此意外地在文件上awk
运行相同脚本两次的问题(并获得编辑“效果”的两倍)awk
文件)很少出现。