0

我想我有一个 sed 或 awk 问题。我正在尝试从 bash 脚本操作配置文件,但我找不到正确的方法。

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

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

并希望将其替换为:

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

我尝试了各种 sed 和 awk 教程,但我找不到。

我想这一定不会太难,但我被卡住了,请帮帮我!!

4

4 回答 4

2

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

为我工作

于 2013-10-08T19:22:08.600 回答
2

使用 GNU awk,您可以一次读取整个文件-v RS='\0'(也可以与其他一些 awk 一起使用):

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

对于其他 awks,您可以使用输入文件中不存在的其他字符,例如 control-C 或类似字符,而不是\0上面的记录分隔符,或者您可以这样做:

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

但它会将连续空白行的序列压缩为单个空白行,并在文件末尾添加一个尾随空白行(如果尚不存在)。

最后,您可以使用任何 awk 一次读取一行的整个文件内容构造一个字符串,然后在 END 部分对该字符串进行操作:

$ awk '{s=s $0 ORS} END{gsub(/\n{/,"{\n",s); printf "%s",s}' file
bla.update({
'test': {'tag': 'twenty',
于 2013-10-08T19:39:08.257 回答
1

这是一个尝试使用sed

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

样本输入:

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

输出:

bla.update({
'test': {'tag': 'twenty',
于 2013-10-08T19:19:26.310 回答
1

有些像这样:

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

它搜索bla.update然后{在末尾添加并设置标志f=1 如果设置了标志,则从行f首删除{并清除标志。

于 2013-10-08T19:15:09.977 回答