2013-10-08 49 views
0

我想我有一个sed或awk问题。我试图从bash脚本中操作一个配置文件,但是我找不到正确的方法来完成它。AWK或Sed,还是一起?

我在配置文件中的以下内容:

bla.update(
{'test': {'tag': 'twenty', 

并希望将其更换到:

bla.update({ 
'test': {'tag': 'twenty', 

我尝试过各种sed的& awk的教程,但我找不到它。

我猜不应该太难,但我卡住了,请帮助我!

+0

只是移动的一般模式打开括号到前一行? – SheetJS

+0

是的,那是唯一的确.. – Ron

回答

2

sed ':a;N;$!ba;s/(\n{/({\n/g'

对我的作品

+0

也适用!谢谢!! – Ron

1

一些这样的:

awk 'f {sub(/{/,x);f=0} /bla.update/ {$0=$0 "{";f=1}1' 
bla.update({ 
'test': {'tag': 'twenty', 

它搜索bla.update然后添加{末,并设置标志f=1 如果标志f设置,那么从线和清晰的标志开始删除{

+1

酷!那样做了。谢谢! – Ron

1

下面是使用的尝试sed

sed 'N;s/(\s*\n\s*{/({\n/g' file 

样品输入:

bla.update(
{'test': {'tag': 'twenty', 

输出:

bla.update({ 
'test': {'tag': 'twenty', 
2

随着GNU AWK这样你就可以一次读取使用-v RS='\0'整个文件(也将与其他一些awks工作):

$ awk -v RS='\0' -v ORS= '{gsub(/\n{/,"{\n")}1' file 
bla.update({ 
'test': {'tag': 'twenty', 

与其他awks你可以使用一些其他的字符是不存在的输入文件,例如一个控制-C或类似的,而不是\0如记录分隔符上方或可以这样做:

$ awk -v RS= -v ORS='\n\n' '{gsub(/\n{/,"{\n")}1' file 
bla.update({ 
'test': {'tag': 'twenty', 

但它将压缩的连续的空行序列到一个空行,并在末尾添加尾空白行如果其中一个还没有出现的话。

最后,您可以构建从整个文件内容的字符串读取使用任何AWK一次在一个行,然后在最后一节对字符串进行操作:

$ awk '{s=s $0 ORS} END{gsub(/\n{/,"{\n",s); printf "%s",s}' file 
bla.update({ 
'test': {'tag': 'twenty',