如何使用sed仅在包含其他模式的行中替换文件中的模式

时间:2013-04-15 17:35:16

标签: regex bash sed

在我的特定情况下,我需要遍历数百个包含存储URL的变量的文件。所有的URL都不同,但为了这个例子,我们可以假设它们都以“com”'

结尾

我需要在com

之后立即添加一些文字

因为所有网址都有不同的域名,所以我不能使用sed命令,如:

  

sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'

因为文件包含其他可能包含com的行,所以我不能使用类似:

的内容
  

sed -i 's/com/com.origin.net/g'

我需要进行此搜索并仅替换包含模式的特定行,例如下面的正则表达式中的示例:

  

^ENVIRONMENT.*

如果我可以将sed的使用仅集中在与上述模式匹配的行上,那么我可以使用sed -i 's/com/com.origin.net/g'等sed的一些改编。我当然可以编写一个过于复杂的bash脚本来执行此操作,但我知道有一个很好的一种方法可以告诉sed找到一个模式,只能在找到模式的行上工作,并搜索并替换另一个模式用一个新的字符串。

在搜索Google时,我发现的唯一半相关链接是:

https://unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string

但它没有充分回答我的问题。也可以通过一个很好的工具将一般情况下的sed约束到一个与模式相匹配的线上来加入我的sed arsenal。

我们非常感谢能够提供解决方案的任何帮助。

以下是文件

的示例
  

### Example File
  #
  #
  # someurl.com
  
  ENVIRONMENT="someurl.com"

我想将'ENVIRONMENT =“someurl.com”'替换为'ENVIRONMENT =“someurl.com.orign.net”'

我可能会在一个行shell脚本中插入从这篇文章派生的sed命令,例如:

  

`for f in * .config; do File2BeEdited = $(cat $ f | grep ^ PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); if [“$ File2BeEdited”!=“”];然后RunSedCommand; printf“\ n发现需要编辑的文件。\ n运行$ f>> log.log”;完成

因此,我可以遍历目录中的每个配置文件并有选择地进行此更改

2 个答案:

答案 0 :(得分:10)

以下命令行显示了两种可能的解决方案:您可以使用/regex/将替换限制为某些行。您可以在\0\1等替换中使用匹配的文字。

sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/'

答案 1 :(得分:-3)

你可以用gvim来实现..

:g / ^ baz / s / foo / bar / g

解释:在以baz开头的所有行中,用bar替换所有出现的foo。

检查 http://vim.wikia.com/wiki/Search_and_replace 了解更多详情......