Linux 如何在文件中的匹配行中插入字符
例如,我有一个包含以下内容的文件:Linux 如何在文件中的匹配行中插入字符,linux,bash,Linux,Bash,例如,我有一个包含以下内容的文件: { a : "apple" b : "orange" } { a : "meat" } 我想在所有带有“a:”的行中添加“_1”,结果如下: { a : "apple_1" b : "orange" } { a : "meat_1" } bash命令是否有任何方法您的间距不清楚,是否有“a:…”或“a:…”。您还有类似于json的内容,如果是这样,您需要使用json感知实用程序来确保结果被验证为有效的json
{
a : "apple"
b : "orange"
}
{
a : "meat"
}
我想在所有带有“a:”的行中添加“_1”,结果如下:
{
a : "apple_1"
b : "orange"
}
{
a : "meat_1"
}
bash命令是否有任何方法您的间距不清楚,是否有
“a:…”
或“a:…”
。您还有类似于json的内容,如果是这样,您需要使用json感知实用程序来确保结果被验证为有效的json
但是,如果它只是文本,那么awk
可以通过检查第一个字段(或者在“a:…”
的情况下是第一个和第二个)是否与a:
前缀匹配来为您处理任何一种情况(“a:…”
)。然后,您只需将\u 1
附加到行的末尾,以便在整行上使用sub
函数保留前导空格(例如$0
)。在所有情况下,都会输出该行,如果满足前缀,则该行将保持不变或附加\u 1
您可以通过以下方式实现:
awk '$1=="a:" || ($1=="a" && $2==":") {sub(/"$/,"_1\"",$0)}1' file
(注意:您可以删除不需要的|
的任何一面)
您可以在以下位置查看sub
功能的用户:
示例使用/输出
在文件
中输入文件后,将显示以下结果:
$ awk '$1=="a:" || ($1=="a" && $2==":") {sub(/"$/,"_1\"",$0)}1' file
{
a : "apple_1"
b : "orange"
}
{
a : "meat_1"
}
使用sed
您还可以使用sed
(在这种情况下可能会稍微更有效)完成相同的任务,方法是:
请仔细检查,如果有问题,请告诉我。在行前加上四个空格。欢迎!在寻求帮助之前,你应该先尝试找到解决办法。你试过什么?提示:
sed
和awk
是合适的。对于sed
版本,也许我们还可以在末尾支持空格sed'/^\s*a\s:/s/\(“\s*\)$/\u 1\1/”文件
这是个好主意,我不确定你是否想保留它,但也许你会保留。我也需要\u 1
后面的“
。谢谢你的提示。实际上,它是一个C++模式二进制文件的原始模式中解析的CONF文件。我想在脚本文件中重复运行二进制文件,但每次运行二进制文件时,我必须首先更新conf文件。{}中的内容是重复的消息。明白了。如果您需要将“\u 1”
变为变量,那么它应该可以工作,这也是可行的,但是您必须双引号引用sed
调用,这意味着您需要在表达式本身中转义”
。抱歉,但是我已经尝试了sed命令,它无法获得与awk相同的结果。我哪里出错了?
sed '/^\s*a\s:/s/"$/_1"/' file