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

使用SED添加行

  •  1
  • user4893295  · 技术社区  · 6 年前

    尽管在注册表检查程序中检查了我的regex,但似乎找不到正确的方法来执行此操作。

    给定一个文本文件,其中包含以下条目:

    zone    "example.net"    {
            type master;
            file "/etc/bind/zones/db.example.net";
            allow-transfer { x.x.x.x;y.y.y.y; };
            also-notify { x.x.x.x;y.y.y.y; };
    };
    

    我想在还通知行之后添加行,专门针对该域。

    因此,使用此SED命令字符串:

    sed '/"example\.net".*?also-notify.*?};/a\nxxxxxxx/s' named.conf.local
    

    我想应该在这行后面加上“XXXXXXX”。但没有。我做错什么了?

    3 回复  |  直到 6 年前
        1
  •  0
  •   dawg    6 年前

    使用posix-sed,可以使用 a 对于带有转义文字新行的append命令:

    $ sed  '/^[[:blank:]]*also-notify/ a\
    NEW LINE' file
    

    使用GNU SED, 由于新线假定为:

    $ gsed  '/^[[:blank:]]*also-notify/ a NEW LINE' file
    

    问题与 sed 在您的示例中是两倍。

    第一个是任何 塞德 regex不能用于多行匹配,如中所示 example\.net".*?also-notify.*? . 这更像是Perl类型的匹配。开始时需要使用范围运算符,如下所示:

    $ sed  '/"example\.net/,/also-notify/{
           /^[[:blank:]]*also-notify/ a\
        NEW LINE 
        }' file
    

    第二个问题是 \n 在附加文本中。使用posix-sed, \n 在任何上下文中都不受支持。使用GNU SED时,假设新线路和 n 不在上下文中(如果在 )并解释为转义文本 n . 你可以用 n 在1个字符后使用GNU SED,但不能在之后立即使用。在posix-sed中,附加行的前导空格将始终被剥离。

        2
  •  0
  •   RavinderSingh13 Nikita Bakshi    6 年前

    跟随 awk 可能会有帮助。

    awk -v new_lines="new_line here" '/also-notify/{flag=1;print new_lines} /^};/{flag=""} !flag'  Input_file
    

    如果要编辑输入文件本身,请附加 > temp_file && mv temp_file Input_file 以上代码也一样。阿尔索 print new_lines 这里的新行是一个变量,您也可以直接在其中打印新的客户机。

        3
  •  0
  •   Zak    6 年前

    你已经很接近了。只是使用一个范围( /pattern/,/pattern/{ #commands } )选择要操作的文本,然后使用 /pattern/a/\ ... 添加所需行。

    /"example\.net"/,/also-notify/{
    /also-notify/a\
    \        this is the text I want to add.
    }
    

    SED在要附加的文本上修剪前导空格。添加反斜杠 \ 在行首可以防止这种情况。

    在bash中,这看起来像:

    sed -e '/"example\.net"/,/also-notify/{
      /also-notify/a\
      \        this is the text I want to add.
      }' named.conf.local
    

    还要注意的是,sed使用的是一种古老的正则表达式方言,它不支持非贪婪量词,比如 *? .