如何在sed或awk中连接两个模式之间的线

如何在sed或awk中连接两个模式之间的线,awk,sed,Awk,Sed,我有一个json文件,我想在括号中加入x行 cat testfile.json { "CacheStatistics_ReadHits": 0, "CacheStatistics_ControllerPrefetchRemaining": [ 0, 0 ], "CacheStatistics_ControllerReadMisses": [ 0, 0 ] } 我尝试了以下方法,应该执行换行符替换,首先从以“[”结尾的行开始,一直到结束括号“]”

我有一个json文件,我想在括号中加入x行

cat testfile.json
 {
  "CacheStatistics_ReadHits": 0,
  "CacheStatistics_ControllerPrefetchRemaining": [
   0,
   0
  ],
  "CacheStatistics_ControllerReadMisses": [
   0,
   0
  ]
 }
我尝试了以下方法,应该执行换行符替换,首先从以“[”结尾的行开始,一直到结束括号“]”

sed -i '/\[$/,/\]/ s/\n//g' testfile.json
/\[$/
搜索以开括号结尾的行。
/\]/
继续,直到到达结束括号。
s/\n//g
将换行符替换为空

生成的文件应为:

 {
  "CacheStatistics_ReadHits": 0,
  "CacheStatistics_ControllerPrefetchRemaining": [0, 0],
  "CacheStatistics_ControllerReadMisses": [0, 0]
 }

这个程序会解决你的问题。您可以将其保存在名为:
myprogram.awk

{
if($0 ~ /.*CacheStatistics_ControllerPrefetchRemaining/ ||  $0 ~ /.*CacheStatistics_ControllerReadMisses/){
        datos="";
        gsub("\\n","",$0); datos=datos$0;  
        getline; 
        gsub("\\n","",$0); gsub(" ","",$0); 
        datos=datos$0;
        getline; 
        gsub("\\n","",$0); gsub(" ","",$0); 
        datos=datos$0;
        getline;
        gsub(" ","",$0);  
        datos=datos$0;
        print datos;
}
else
    print $0;
您可以这样执行:

awk -f program.awk testfile.json
testfile.json
是您发布的数据

我得到了这个输出:

{
  "CacheStatistics_ReadHits": 0,
  "CacheStatistics_ControllerPrefetchRemaining": [0,0],
  "CacheStatistics_ControllerReadMisses": [0,0]
}

这个程序会解决你的问题。您可以将其保存在名为:
myprogram.awk

{
if($0 ~ /.*CacheStatistics_ControllerPrefetchRemaining/ ||  $0 ~ /.*CacheStatistics_ControllerReadMisses/){
        datos="";
        gsub("\\n","",$0); datos=datos$0;  
        getline; 
        gsub("\\n","",$0); gsub(" ","",$0); 
        datos=datos$0;
        getline; 
        gsub("\\n","",$0); gsub(" ","",$0); 
        datos=datos$0;
        getline;
        gsub(" ","",$0);  
        datos=datos$0;
        print datos;
}
else
    print $0;
您可以这样执行:

awk -f program.awk testfile.json
testfile.json
是您发布的数据

我得到了这个输出:

{
  "CacheStatistics_ReadHits": 0,
  "CacheStatistics_ControllerPrefetchRemaining": [0,0],
  "CacheStatistics_ControllerReadMisses": [0,0]
}

假设
sed
使用范围模式将整个多行块抓取到模式空间中,这是错误的。它只是在开始/结束分隔符之间逐行读取。使用GNU sed,您可以使用
sed-i'/\[$/,/]/{:a;$!{N;ba};:b;s/\(\[^][*\)\N/\1/g;tb;}“json
你为什么要这样做?谢谢,Wiktor,但GNU sed不幸不是我的选择。我确实尝试了类似于你建议的东西,但在它不起作用时无法调试。你有使用BSD sed的答案吗?假设
sed
用范围pat将整个多行块抓取到模式空间中是错误的terns。它只是在开始/结束分隔符之间逐行读取。使用GNU sed,您可以使用
sed-i'/\[$/,/]/{:a;$!{N;ba};:b;s/\(\[^][*\)\N/\1/g;tb;}'json
您为什么要这样做?谢谢,Wiktor,但遗憾的是GNU sed不是我的选择。我尝试过类似于您建议的方法,但在它不起作用时无法调试。您有使用BSD sed的答案吗?