Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex GNU-sed与未换格字符的匹配行_Regex_Linux_Sed_Terminal_Gnu - Fatal编程技术网

Regex GNU-sed与未换格字符的匹配行

Regex GNU-sed与未换格字符的匹配行,regex,linux,sed,terminal,gnu,Regex,Linux,Sed,Terminal,Gnu,我遇到了SED的问题,它的表现与我预期的不太一样。我试图在匹配后附加到行(使用换行符,\n)。我正在尝试为我们所有部署的机器以及所有未来的机器自动修复一个服务文件(好吧,直到供应商修复它) 假设我有一个名为“foo.service”的文件,它如下所示: [Unit] Description=Foo After=network.target [Service] User=UserFoo Environment="SERVICENAME=foo" Environment="SERVICEPATH=

我遇到了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”匹配.我建立了一个简单得多的文件来处理表达式,以查看哪里出了问题,我能找到的最好结果是括号是一个未转义的字符

我尝试了两个命令,它们给出了不同的结果。(结果->)

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

[abc]
cde
efg
ghi
我的命令哪里出了问题?我尝试过用各种引号和其他转义字符来封装模式,但到目前为止还没有成功。有什么输入吗

干杯, 迈克

带着这个-:

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

我不知道如何将此标记为答案,但谢谢!我猜我的命令在尝试转义字符后仍无法工作的部分原因是因为我没有使用扩展正则表达式(-E)。有趣的是,您使用的是&而不是a。我的理解是,“a”应该在匹配后追加。但在尝试使用替换后的命令后,它用“a”重新写入了[Service]行。编辑:标记为已接受!删除了不需要的
-E
开关
[abc]
cde
efg
ghi
sed 's/^\[Service\]/&\nRestart=on-failure\nRestartSec=60/' foo.service
[Unit]
Description=Foo
After=network.target

[Service]
Restart=on-failure
RestartSec=60
User=UserFoo
[...]