GNU sed带有未转义字符的匹配行

问题描述 投票:0回答:1

我遇到了SED的问题,并且表现得不尽如人意。我正在尝试在比赛后附加到行(使用换行符,\ n)。我正在尝试为所有已部署的计算机以及以后所有的计算机自动修复Service文件(嗯,直到供应商对其进行修复)。

假设我有一个名为“ 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”,否则它将多次写入输出(它将与以下行匹配:[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个回答
0
投票

使用此-

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将方括号视为字符的class
  • &是替换项中匹配的项
© www.soinside.com 2019 - 2024. All rights reserved.