我想我有一个 sed 或 awk 问题。我正在尝试从 bash 脚本操作配置文件,但我找不到正确的方法。
我的配置文件中有以下内容:
bla.update(
{'test': {'tag': 'twenty',
并希望将其替换为:
bla.update({
'test': {'tag': 'twenty',
我尝试了各种 sed 和 awk 教程,但我找不到。
我想这一定不会太难,但我被卡住了,请帮帮我!!
sed ':a;N;$!ba;s/(\n{/({\n/g'
为我工作
使用 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',
这是一个尝试使用sed
sed 'N;s/(\s*\n\s*{/({\n/g' file
样本输入:
bla.update(
{'test': {'tag': 'twenty',
输出:
bla.update({
'test': {'tag': 'twenty',
有些像这样:
awk 'f {sub(/{/,x);f=0} /bla.update/ {$0=$0 "{";f=1}1'
bla.update({
'test': {'tag': 'twenty',
它搜索bla.update
然后{
在末尾添加并设置标志f=1
如果设置了标志,则从行f
首删除{
并清除标志。