【问题标题】:GNU sed matching lines with unescaped characters带有未转义字符的 GNU sed 匹配行
【发布时间】:2020-10-03 14:43:35
【问题描述】:

我在使用 SED 时遇到了一个问题,它的行为与我预期的不太一样。我试图在比赛后附加到行(使用换行符,\n)。我正在尝试为我们所有部署的机器以及所有未来的机器自动修复服务文件(嗯,直到供应商修复它)。

假设我有一个名为“foo.service”的文件,如下所示:

[Unit]
Description=Foo
After=network.target

[Service]
User=UserFoo
Environment="SERVICENAME=foo"
Environment="SERVICEPATH=/opt/foo"
Environment="SERVICEMAINCLASS=com.GoogleFoo.service.foo.ServiceRunner

我需要将 sed 匹配到“[Service]”。我无法匹配“服务”,否则它将多次写入输出(它将匹配以下行:[Service] 和行“Environment="SERVICEMAINCLASS=com.GoogleFoo.service.foo.ServiceRunner""。我构建了一个更简单的文件来处理表达式,看看哪里出了问题,我能找到的最好的就是括号是一个未转义的字符。

我尝试了两个给出不同结果的命令。 (结果 -> Imgur Link

sed -i "/[abc]/aRestart=on-failure\nRestartSec=60" TestFile && cat TestFile
sed -i "/abc/aRestart=on-failure\nRestartSec=60" TestFile.bak && cat TestFile.bak

其中 testFile 和 TestFile.bak 是同一个文件

[abc]
cde
efg
ghi

我的命令哪里出错了?我尝试用各种引号和其他转义字符将模式封装起来,但迄今为止还没有奏效。有什么意见吗?

干杯, 迈克

【问题讨论】:

    标签: regex linux sed terminal gnu


    【解决方案1】:

    有了这个-

    sed 's/^\[Service\]/&\nRestart=on-failure\nRestartSec=60/' foo.service
    

     输出

    [Unit]
    Description=Foo
    After=network.target
    
    [Service]
    Restart=on-failure
    RestartSec=60
    User=UserFoo
    [...]
    

     解释

    • 您需要转义方括号,因为sed 将它们视为一个字符
    • & 是替换中的匹配项

    【讨论】:

    • 我不知道如何将此标记为答案,但谢谢!我猜测即使在尝试转义字符之后我的命令也无法工作的部分原因是因为我没有使用扩展正则表达式(-E)。有趣的是,您使用 & 而不是 a。我的理解是'a'应该在比赛后附加。但是在尝试用它替换您的命令后,它用“a”重新编写了 [Service] 行。编辑:标记为已接受!
    • 移除了不需要的-E开关
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多