Unix sed 命令替换文件中的括号

J S*_*zum 4 sed

我需要更换"..."<...>在一个文件中。我已经使用这个命令sed '/^#include/s/"/</g' file.c找到这里,但输出不正确。我怎样才能解决这个问题?

输入:

#include "stdlib.h"
#include "graph.h"
Run Code Online (Sandbox Code Playgroud)

输出:

#include <stdlib.h<
#include <graph.h<
Run Code Online (Sandbox Code Playgroud)

预期输出:

#include <stdlib.h>
#include <graph.h>
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 13

命令的问题g在最后。它将导致在匹配的每一行上替换所有双引号。请注意您链接到的 StackOverflow 问题如何与替换with (可以在相关行上使用或效率较低地使用来完成),而不是您想要的相反方式。<^#include<>""y/<>/""/s/[<>]/"/g

如果您先使用s/"/</(no g) 然后使用s/"/>(no ghere or),您就可以了:

sed '/^#include/ { s/"/</; s/"/>/; }' file.c >file-new.c
Run Code Online (Sandbox Code Playgroud)

第一个替换替换第一个双引号,第二个替换替换现在修改后的字符串中的第一个。

要更正文件(假设您进行了就地编辑),只需<将行尾的替换为>

sed '/^#include/ s/<$/>/' file.c >file-new.c
Run Code Online (Sandbox Code Playgroud)

这匹配<$<行尾的an ),并将其替换为>.

查看结果file-new.cfile.c如果看起来没问题,则用它替换。


sch*_*ity 10

您需要"为两个不同的字符<和替换两个相等的字符>。您的命令不起作用,因为它仅将一个字符的所有出现替换"一个字符<。所以试试这个:

# capture the final word between double quotes
# and replace it for itself enclosed in brackets
$ sed '/^#include/s/"\([^"]*\)"/<\1>/' file
#include <stdlib.h>
#include <graph.h>
Run Code Online (Sandbox Code Playgroud)