首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个命令行实用程序可以在文本文件中找到一个特定的行块并替换它?

是否有一个命令行实用程序可以在文本文件中找到一个特定的行块并替换它?
EN

Ask Ubuntu用户
提问于 2011-01-08 19:11:08
回答 2查看 2.5K关注 0票数 7

更新(见问题结束)

我看到的“搜索和替换”实用程序,似乎只是逐行搜索.

是否有一个命令行工具可以定位一行(在文本文件中),并将其替换为另一个行块。

例如:测试文件文件是否包含以下行的exact group

代码语言:javascript
复制
'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可以做一些方法来定位文本块(一旦找到了,替换就会非常直接;使用headtail) .‘'diff’转储所有必要的数据,但我还没有想出如何过滤它,.(我还在努力)

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2011-01-09 17:57:32

这个简单的python脚本应该完成以下任务:

代码语言:javascript
复制
#!/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))

与大多数其他解决方案一样,它的缺点是将整个文件一次性输入内存。然而,对于较小的文本文件,它应该工作得足够好。

票数 7
EN

Ask Ubuntu用户

发布于 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酒吧

吐出来:

罐头

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/20649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档