每条记录都带有列名。它是管道定界的。我必须在每个记录中替换它们,如下所示: 输入:
COMPILES=1|PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|SCPU=30828
输出:
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828
我正在尝试使用命令sed 's/[^|]*=//g'
替换所有非|序列。字符,后跟=
,但在第二列中仅打印最后一个值。有没有一种方法可以替换每个字段中的第一个实例?
1|en-US|30828
答案 0 :(得分:1)
使用sed:
$ sed 's/\(^\||\)[^=]\+=/\1/g' file
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828
解释:
s/
替换\(^\||\)[^=]\+=
开头(^
或(\|
)分隔符(|
)以及所有非=
和=
< / li>
/\1/g
,其开头或分隔符(\1
)全局(g
)即。将^THIS=
替换为^
,将|THIS=
替换为|
。
答案 1 :(得分:0)
尝试一下:
awk -v RS='|' -v ORS='|' '{sub("[^.]*=","")}1' input | sed "s|\|$||g"
RS
,记录分隔符,通常是换行符,在这种情况下,它更改为|
,因此记录将是COMPILES=1
或PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US
ORS
,输出记录分隔符,也是换行符,更改为|
,因此在打印时,输出将由|
分隔sub("[^.]*=","")
是一个懒惰的正则表达式,用于替换=
之前的第一个值,有关https://unix.stackexchange.com/questions/49601/how-to-reduce-the-greediness-of-a-regular-expression-in-awk sed "s|\|$||g"
删除最后一个|
答案 2 :(得分:0)
另一个awk
$ awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i++) sub(/[^=]+=/,"",$i)}1' file
结果
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828
答案 3 :(得分:0)
使用Perl
$ cat mullapudi.log
COMPILES=1|PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|SCPU=30828
$ perl -F"\|" -ane ' s/^.+?=//g for @F; print join("|",@F) ' mullapudi.log
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828