在 bash 脚本终端中查找并替换文本

在 bash 脚本终端中查找并替换文本

我有一个文件/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

相关内容