我有一个文件/home/count/1/details/info.txt
如下
title1 {
key1 value1
key2 value2
key3 value3
}
info {
name1 text
post1 anything
salary 1
work day1
work day2
work day3
}
work {
department sell
store ground
remarks
}
contact {
required No
}
现在我需要改变以上至:
title1 {
key1 value1
key2 value2
key3 value3
}
info {
name1 text
post1 anything
salary 1
work day1
work day2
work day3
work day4
work day5
work day8
}
work {
department sell
store ground
remarks
Absent No
}
contact {
required No
}
信息组添加了 3 个新值work day4
, work day5
, work day8
。工作组获得了新的值,即Absent
。
标题(即 title1、info、work)是固定的,无法更改。但 {} 之间的值是动态可变的并且可以是任何值。但关键工作是固定的,只能添加或删除,不能修改。
我必须编写 bash 文件才能完成此任务。我只能使用具有 ubuntu 20.04 服务器最小版本的终端。
有什么想法、建议、帮助吗?
谢谢
答案1
和perl
:
perl -0777 -pi -e '
s{^info\s*\{.*?\K(?=\})}{join "", map {"work day$_\n"} 4,5,8}mse;
s{^work\s*\{.*?\K(?=\})}{Absent No\n}ms' /home/count/1/details/info.txt
答案2
awk 'BEGIN {RS=ORS="\n\n"};
/^info {/ { gsub("}","work day4\nwork day5\nwork day8\n}") };
/^work {/ { gsub("}","Absent No\n}") };
1' info.txt
这告诉 awk 一次读取输入文件的一个段落(即,通过将输入记录分隔符设置RS
为,记录由两个换行符分隔,而不仅仅是一个换行符\n\n
)。它还将输出记录分隔符设置为与 相同RS
,以便输出在记录之间也有一个空行。
然后,它使用该函数在每个匹配段落末尾(以“info {”或“work {”开头的段落)gsub()
之前添加额外的行。}
其实,它取代这些记录末尾}
带有额外行的和a }
- 这实际上与插入额外的行相同。
最后一个1
是 awk 的简写形式print
,并打印每条记录,无论它是否已被修改。
答案3
另外,awk
在段落模式下,您可以尝试以下代码:
awk -v s1="Absent No\n" -v s2="work day4\nwork day5\nwork day8\n" -v OFS="\n" -v RS= -v ORS='\n\n' '$1 == "work" {sub(/}/, s1"&")} $1 == "info" {sub(/}/, s2"&")} 1' file
title1 {
key1 value1
key2 value2
key3 value3
}
info {
name1 text
post1 anything
salary 1
work day1
work day2
work day3
work day4
work day5
work day8
}
work {
department sell
store ground
remarks
Absent No
}
contact {
required No
}
答案4
sed -i -e '
/^info {/,/}/ s/}/work day4\nwork day5\nwork day8\n&/
/^work {/,/}/ s/}/Absent No\n&/
' /home/count/1/details/info.txt
perl -i -lpe '
/^info \{/.../}/ and /}/ && do{
print for map { "work day$_" } 4,5,8};
/^work \{/.../}/ and /}/ &&
print "Absent No";
' /home/count/1/details/info.txt