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