我得到了这样的字段:
Dagmar Schlecht(ID: 1233), Taubenstr- 246, 71108 Germany, dr_schlecht@t-online-de 1233 Shopping cart #3664 - Grüne Pillen;
如何在第一个“)”出现之前打印字符,例如$ 1和〜/“Shopping”中的字符和19个字符(因此跳过部分“ - GrünePillen”)?
结果应写入新字段,例如$ 2:
Dagmar Schlecht(ID: 1233) Shopping cart #3664
答案 0 :(得分:1)
如果您对sed
感到满意:
sed -r 's/(^[^,]+).*(Shopping cart[^-]+)(.*)/\1 \2/' inputfile
Dagmar Schlecht(ID: 1233) Shopping cart #3664
这里,backrefrencing用于将记录分成多个块,然后使用\N
引用。每个组由()
相同的正则表达式可以与gawk
一起使用支持thired参数的match
函数。
awk '{match($0,/(^[^,]+).*(Shopping cart[^-]+)(.*)/,a);print a[1],a[2]}'
Dagmar Schlecht(ID: 1233) Shopping cart #3664
答案 1 :(得分:0)
在awk中可能有一个更漂亮的方法,但这很好地完成了这项工作:
awk -F"[ ,]" '{cartFound=0; printf "%s %s %s", $1, $2, $3; for (i=4;i<=NF;++i){if($i=="Shopping"){cartFound=1} if(cartFound==1){ printf " %s", $i} if($i ~ /^#/){cartFound=0}}}{printf "\n"}' inputFile
我们在这里:
F"[ ,]"
cartFound
变量设置为0
:cartFound=0
printf
打印前三个字段,因此它不会引入换行符:printf "%s %s %s", $1, $2, $3;
i
:for (i=4;i<=NF;++i){
Shopping
,则我们将cartFound
变量设置为1
:if($i=="Shopping"){cartFound=1}
cartFound
为1
,我们会再次使用printf
将字段添加到输出中:if(cartFound==1){ printf " %s", $i}
cartFound
设置回0
:if($i ~ /^#/){cartFound=0}
printf
输出换行符以结束输出的记录:{printf "\n"}
。答案 2 :(得分:0)
sed 方法:
sed -En 's/^([^,]+),.+(Shopping.{11}).*/\1 \2/p' testfile
Dagmar Schlecht(ID: 1233) Shopping cart #3664
答案 3 :(得分:0)
awk '{print $1,$2,substr($3,1,5),$10,$11,$12}' file
Dagmar Schlecht(ID: 1233) Shopping cart #3664