更新(见问题结束)
我看到的“搜索和替换”实用程序,似乎只是逐行搜索.
是否有一个命令行工具可以定位一行(在文本文件中),并将其替换为另一个行块。
例如:测试文件文件是否包含以下行的exact group:
'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe:
All mimsy were the borogoves,
And the mome raths outgrabe.
'Beware the Jabberwock, my son!
The jaws that bite, the claws that catch!
Beware the Jubjub bird, and shun
The frumious Bandersnatch!'我希望这样做,这样我就可以在一个文件中替换多行文本,并且知道我没有覆盖错误的行。
我永远不会取代“贾贝沃基”(刘易斯·卡罗尔饰),但这是一个新颖的例子:)
更新:
(子更新)我下面关于不使用sed的原因的评论只是在上下文中;不要把任何工具推得太过它的设计意图(我经常使用sed,并且认为它是非常宝贵的。)
我刚刚发现了一个有趣的关于sed和什么时候不使用它的网页。
因此,由于sed的所有答案,我将发布链接.它是sed常见问题在sourceforge上的应用的一部分
另外,我很确定diff可以做一些方法来定位文本块(一旦找到了,替换就会非常直接;使用head和tail) .‘'diff’转储所有必要的数据,但我还没有想出如何过滤它,.(我还在努力)
发布于 2011-01-09 17:57:32
这个简单的python脚本应该完成以下任务:
#!/usr/bin/env python
# Syntax: multiline-replace.py input.txt search.txt replacement.txt
import sys
inp = open(sys.argv[1]).read()
needle = open(sys.argv[2]).read()
replacement = open(sys.argv[3]).read()
sys.stdout.write(inp.replace(needle,replacement))与大多数其他解决方案一样,它的缺点是将整个文件一次性输入内存。然而,对于较小的文本文件,它应该工作得足够好。
发布于 2011-01-08 19:42:06
我确定肯定有办法用sed来做这件事。在谷歌上搜索了一下之后,我发现:
http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/
基于此,我最终写到:
sed -n '1h;1!H;${;g;s/foo\nbar/jar\nhead/g;p;}' < x
它正确地接受了x的内容:
foo酒吧
吐出来:
罐头
https://askubuntu.com/questions/20649
复制相似问题