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

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

我需要在文件中替换"..."为。<...>我用过这个命令sed '/^#include/s/"/</g' file.c发现这里,但输出不正确。我怎样才能解决这个问题?

输入:

#include "stdlib.h"
#include "graph.h"

输出:

#include <stdlib.h<
#include <graph.h<

预期输出:

#include <stdlib.h>
#include <graph.h>

答案1

该命令的问题在于g最后。会导致全部<每行匹配的双引号都被替换^#include。请注意您链接到的 StackOverflow 问题如何涉及替换 with <>""可以在相关行上使用y/<>/""/或效率较低的使用来完成s/[<>]/"/g),而不是像您想要的那样相反。

如果你先使用s/"/</(no g) 然后使用s/"/>(g这里也不是),那就没问题了:

sed '/^#include/ { s/"/</; s/"/>/; }' file.c >file-new.c

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

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

sed '/^#include/ s/<$/>/' file.c >file-new.c

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

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

答案2

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

# 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>

相关内容