我试图在bash中找到一种方法,在文件的一部分中包含一行。
特别是,如果我有一个类似的部分:
%salary
1213
3344
23343
33
%end
%employees
joe
mark
adam
%end
我想在雇员的%end部分之前的员工部分中将新员工添加到上述文件(例如,george)。
我怎样才能在bash中做到这一点?
答案 0 :(得分:3)
这可能适合你(GNU sed):
sed -e '/%employees/,/%end/{/%end/iGeorge' -e '}' file
在George
%end
之间的%employee
之前插入%end
。
N.B程序必须使用2个语句,因为i
命令由换行符终止。使用Bash的替代方案是:
sed $'/%employees/,/%end/{/%end/iGeorge\n}' file
答案 1 :(得分:2)
在这种情况下,使用awk(3)
可能最简单:
/%employees/ { INSERT=1 }
/%end/ {
if (INSERT == 1) print "george"
INSERT=0
}
{ print $0 }
示例:
$ awk -f script input
%salary
1213
3344
23343
33
%end
%employees
joe
mark
adam
george
%end
答案 2 :(得分:0)
在Perl中,我会在下面做。
$ perl -00pe 's/(?s)((?:^|\n)%employees.*?)(?=%end)/\1george\n/g' file
%salary
1213
3344
23343
33
%end
%employees
joe
mark
adam
george
%end
答案 3 :(得分:0)
使用GNU awk
awk -v RS= -vFS='\n' -vOFS='\n' '/^%employees/{$NF="george\n"$NF};
{printf "%s%s", $0, RT}' file
%salary
1213
3344
23343
33
%end
%employees
joe
mark
adam
george
%end
答案 4 :(得分:0)
另外两种方式
awk '/%employees/||p&&/%end/{p=!p;if(!p)print "George"}1' file
或
awk '/%employees/,/%end/{if(/%end/)print "George"}1' file