Bash 选择两个相等字符串后的文本

Bash 选择两个相等字符串后的文本,bash,awk,sed,Bash,Awk,Sed,我需要从这样一个文本文件 CPRISM_{2} CPRISM_{2} top_material, bottom_material, side_material, n, h, x1, y1. alpha1, s1, mat1, ... xn, yn, alphan, sn, matn junk junk junkkkkk dawda ... BPRISM_ BPRISM_ top_material, bottom_material, side_material, n,

我需要从这样一个文本文件

CPRISM_{2}  

CPRISM_{2} top_material, bottom_material, side_material,  
n, h,  
x1, y1. alpha1, s1, mat1, 
... 
xn, yn, alphan, sn, matn 

junk junk junkkkkk
dawda
...

BPRISM_ 

BPRISM_ top_material, bottom_material, side_material,
n, h, radius, x1, y1, s1, ... xn, yn, sn
这个

我知道总有一些字符串,换行符,相等的字符串和我想存储的东西,换行符

我用sed尝试了一些标签技巧,但我认为awk在这方面应该更好

awk '{cmd=$1;getline;if($0=""){getline;if(cmd==$1){print $0}}}' rg.txt

不输出任何内容。

尝试此
awk

$ awk 'BEGIN{cmd="";RS=""; ORS="\n"} $1==cmd{gsub(/\n/," "); print $0}; {cmd=$1}' test.txt
CPRISM_{2} top_material, bottom_material, side_material,   n, h,   x1, y1. alpha1, s1, mat1,  ...  xn, yn, alphan, sn, matn 
BPRISM_ top_material, bottom_material, side_material, n, h, radius, x1, y1, s1, ... xn, yn, sn
看看你的
awk
脚本编写水平,我想,这对你来说是不言自明的脚本:)

编辑对于较大的记录大小:
试试这个:

awk 'NF==1{cmd=$1;next} NF==0{next} $1==cmd{printf "%s", $0; while (1) { if (! getline tmp) break; if(length(tmp)) printf " %s", tmp; else break;};print ""}' test.txt
希望这适用于较大的输入文件大小。

这可能适用于您(GNU-sed):


这将匹配模式的前三行,然后删除前两行并附加后续行,直到文件结尾或空行并打印结果。

如何知道行的第一个字?为什么是
BPRISM
而不是
dawda
?就是这样。它的东西,新线,东西,重要的东西和新线再次。要匹配我想要的,必须有两个相等的字符串,用换行符分隔。这就是为什么dawda是错误的。哈哈,awk:超出了程序限制:最大字段数size=32767 FILENAME=“rg.txt”FNR=1 NR=1OK,这个一行脚本适用于您在问题中提到的输入:-)试图检查我是否可以以编程方式模拟
RS=”“
。@bartimar您没有提到文件大小。。一些高尔夫运动:
awk'$1==f{gsub(/\n/,FS);print$0}{f=$1}'RS=ORS=“\n”file
如果你正在打高尔夫,请删除
$0
:)仍然存在同样的问题
awk 'NF==1{cmd=$1;next} NF==0{next} $1==cmd{printf "%s", $0; while (1) { if (! getline tmp) break; if(length(tmp)) printf " %s", tmp; else break;};print ""}' test.txt
sed -rn '/^\s*\S+\s*$/{$!N;$!N;/^\s*(\S+)\s*\n\s*\n\s*\1\s*/!b;:a;$bb;N;/\n\s*$/!ba;:b;s/.*\n\s*\n//;s/\s*\n\s*/ /gp}' file