在Bash中向映射添加条目

6 浏览
0 Comments

在Bash中向映射添加条目

我有一个(Nginx)配置文件,类似于:\ntypes {\n text/html html htm shtml;\n text/css css;\n text/xml xml;\n}\n\n我想在文件中的任何位置添加一个条目,例如:\n

types {
    text/html      html htm shtml;
    text/css       css;
    text/xml       xml;
    image/gif      gif;
}

\n我尝试使用sed,如这个帖子中所示:\n

sed -i "\$i hello" mimes.types
sed: 1: "mimes.types": invalid command code m

\n我在MacOS上使用fish进行测试,但在bash上也遇到了相同的错误。\n在这里我应该使用哪个命令?\n非常感谢!

0
0 Comments

问题的原因是GNU sed和BSD sed在使用上有细微的差异。GNU sed在使用-i选项时不需要额外的参数,而BSD sed则要求-i选项后面必须有一个参数。解决方法是在使用BSD sed时给-i选项添加一个参数。具体的解决方法是使用以下命令:

sed -i .bak "\$i hello" mimes.types

0
0 Comments

问题的原因是需要在一个文件中的特定位置添加一行内容,具体要求是在所有只包含}和可选空白字符的行之前插入一行hello

解决方法是使用Perl的命令行工具来实现。具体的命令是:perl -p -i -l -e 'print "hello" if /^\s*}\s*$/' mimes.types。该命令会将mimes.types文件中的每一行都读入并执行Perl代码,然后将结果输出到文件中。代码中的正则表达式^\s*}\s*$用于匹配只包含}和可选空白字符的行,如果匹配成功,则输出hello

但是,上述方法存在一个限制,即如果文件中有多个}行,则会插入多个hello行。为了解决这个问题,可以使用下面的命令:perl -p -i -l -e 'print("hello"), $done=1 if /^\s*}\s*$/ && !$done' mimes.types。在这个命令中,通过添加判断条件&& !$done来确保只输出一次hello,即使有多个}行存在。变量$done用于记录是否已经输出过hello

以上是使用Perl解决问题的方法和解释。感谢提问者的回复,表示该方法完美解决了问题,但是提问者想要确认是否可以在自己的情况中使用Perl。

0