【问题标题】:Search and Replace ( multiple lines )搜索和替换(多行)
【发布时间】:2018-08-26 17:06:33
【问题描述】:

你好 StackOverflow 社区!

我正在编写一个 bash 脚本来更改 Dynamic 文本文件,我想用一行替换多行。

例如:

这个例子,我想替换THIS

CCCCC 
DDDDD

KKKKK

脚本之前

AAAAA
CCCCC
DDDDD
BBBBB
CCCCC
DDDDD
CCCCC

脚本之后

AAAAA
KKKKK
BBBBB
KKKKK
CCCCC

我找到了一个可以使用 (sed) 替换的脚本,但它不能替换多行。

注意:我是脚本的初学者,所以请解释一下如何轻松完成:)

【问题讨论】:

标签: linux bash shell unix replace


【解决方案1】:

您正在寻找的 sed 表达式是这样的:

sed -e '/CCCCC/{N;s/CCCCC\nDDDDD/KKKKK/}'

这是做什么的?

只要与正则表达式 CCCCC 匹配,它就会命令 sed 执行由大括号分隔的命令块(您可能更愿意将其替换为 ^CCCCC$

每当执行上述块时,它所做的第一件事就是将下一行添加到模式空间。然后它只是执行一个替换命令。

另见the answers to this question in the UNIX & Linux StackExchange community

请注意更多N;命令以向模式空间添加更多行。

例如:

sed -e '/CCCCC/{N; N; s/CCCCC\nDDDDD\nBBBBB/KKKKK/}'

【讨论】:

  • “超过两行”是什么意思?
  • 如果我做了sed -e '/CCCCC/{N;s/CCCCC\nDDDDD\nBBBBB/KKKKK/}',它会起作用吗?
  • 这将替换CCCCC 行,后跟DDDDD,然后是BBBBB 行到KKKKK。如果这就是你想要的,那么是的,它会做到的。
  • 是的,但是当我尝试使用两行时它可以工作,但超过两行(三行或更多)就不行了。
  • 是的,你是对的,我的错。您必须将第三行添加到模式空间:sed -e '/CCCCC/{N; N; s/CCCCC\nDDDDD\nBBBBB/KKKKK/}'。请注意额外的N 命令将第三行添加到模式空间。
【解决方案2】:

你可以这样做

tr '\n' ' ' < yourText.txt | sed "s/CCCCC DDDDD/KKKKK/g" | tr -s ' ' '\n'

要保存,只需在上述命令末尾添加&gt; another.txt

【讨论】:

  • 请不要惩罚试图回答问题的回答者,即使这个问题被少数人认为是没有根据的。我们竭尽全力提供答案。
  • 这只是@jww 的惯用伎俩。我会像往常一样投票支持每个人来补偿......
  • 谢谢,很好,但如果文本、短语等中有空格,就会出现问题。此外,它不适用于多行,只能用于两行。
  • 此答案专门针对您在问题中指定要替换的模式提供。如果您想要比这更复杂的东西,perl 或 python 是您脚本的更好选择。看看unix.stackexchange.com/questions/26284/…
  • 当你已经确定你的文件没有windows行尾时,你可以使用\r作为临时字段:tr '\n' '\r' &lt; yourText.txt | sed 's/CCCCC\rDDDDD/KKKKK/g' | tr -s '\r' '\n'
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 2018-05-16
  • 2015-08-24
  • 2021-02-18
  • 2013-10-18
  • 2015-02-20
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多