代码之家  ›  专栏  ›  技术社区  ›  neil

在Shell脚本中搜索一个模式并用另一个模式替换下一行

  •  1
  • neil  · 技术社区  · 10 月前

    我有一个逗号分隔的文件,有3个值。我想找到模式1,在下一行中,我有值2,需要将其替换为值3。

    例如,文件

    XXX,YYY,ZZZ
    AAA,BBB,CCC
    

    我需要比较一下 XXX ; 当我在下一行匹配时 YYY ,需要替换为 ZZZ

    这是我的代码:

    $ cat test.txt
    [tst]
    Database=xxx
    HostName=yyy
    
    [tst1]
    Database=aaa
    HostName=bbb
    
        
    $ cat ref.txt
    XxX,Yyy,ZZz
    aaa,Bbb,Ccc
    
    $code.sh
    while read line;
    do
    Name=`echo $line | awk -F ',' '{print $1}'`;
    Source=`echo $line | awk -F ',' '{print $2}'`;
    Dest=`echo $line | awk -F ',' '{print $3}'`;
    echo $Name
    echo $Source
    echo $Dest
    sed -ri '/$Name/I { n; s/$Source/$Dest/I }' test.txt
    done < ref.txt 
    
    It doesnt generate disired result and test.txt remains same after running code.sh(without any error). 
    
    
    
    
    
    
    
    
    
    
    2 回复  |  直到 10 月前
        1
  •  1
  •   Barmar    10 月前

    使用 awk 。当您匹配搜索模式时,请使用 getline 转到输入中的下一行并执行替换。

    awk '/XXX/ { print; getline; sub("YYY", "ZZZ"); print}'
    
        2
  •  1
  •   The Potato    10 月前

    您可以使用sed和以下命令来实现此目的: sed -r '/XXX/ { n; s/YYYY/ZZZ/ }' file.txt 其工作原理如下:

    1. “/XXX/”搜索模式“XXX”。
    2. “{n;…}”在找到模式时执行块内的命令n移动到下一行。
    3. 's/YYYY/ZZZ/在下一行用“ZZZ”替换“YYY”。

    注意:-r选项启用扩展正则表达式,这允许您在不转义括号的情况下使用括号。

    如果要修改原始文件,请添加-i选项:

    sed -ri '/XXX/ { n; s/YYYY/ZZZ/ }' file.txt
    

    这将用修改后的输出替换原始文件。