Shell 替换文件中指定范围内的值

Shell 替换文件中指定范围内的值,shell,sed,pattern-matching,Shell,Sed,Pattern Matching,我想使用sed命令替换文件中指定范围内的值 假设我有一个文件: [red] rose,garden,tree [green] leaf,tree [blue] water,sea 我只想将[green]块中的“tree”替换为“plant”,以便输出如下所示: [red] rose,garden,tree [green] leaf,plant [blue] water,sea 我使用了sed-I's/tree/plant/g'file1.txt,但是它替换了所有出现的内容。我

我想使用
sed
命令替换文件中指定范围内的值

假设我有一个文件:

[red]
rose,garden,tree
[green]    
leaf,tree
[blue]
water,sea
我只想将[green]块中的“tree”替换为“plant”,以便输出如下所示:

[red]
rose,garden,tree
[green]    
leaf,plant
[blue]
water,sea

我使用了sed-I's/tree/plant/g'file1.txt,但是它替换了所有出现的内容。

我将
awk
用于此:

$ awk '/^\[/ && f {f=0} /^\[green]/ {f=1} f{gsub("tree","plant")} 1' a
[red]
rose,garden,tree
[green]    
leaf,plant
[blue]
water,sea
解释 当您在
[绿色]
块内时,这将设置一个标志

  • /^\[/&&f{f=0}
    当出现以
    [
    开头的新行时,取消设置标志
  • /^\[green]/{f=1}
    如果块是
    [green]
    ,则设置标志
  • f{gsub(“tree”、“plant”)}
    设置标志后,将所有出现的
    tree
    替换为
    plant
  • 1
    按照
    awk
    的默认行为打印行

此sed命令将用
工厂
替换文本
,前提是该文本位于
[green]
块中,该块是一个以字符串
[green]
开头,直到以
[…]开头的行

$ sed '/^\[green\]/,/^\[[^]]*\]/ s/tree/plant/g' file
[red]
rose,garden,tree
[green]    
leaf,plant
[blue]
water,sea

是的,请看下面的解释