如何只发送一段文本?

如何只发送一段文本?

假设我有一个包含 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没有同样的问题。awkGNU都不mawk支持nawk就地编辑(这实际上并不是人们经常想要做的事情),因此意外地在文件上awk运行相同脚本两次的问题(并获得编辑“效果”的两倍)awk文件)很少出现。

相关内容