如何替换每个字段中的值,直到每个记录中的某个字符?

时间:2018-12-28 21:56:02

标签: unix awk sed

每条记录都带有列名。它是管道定界的。我必须在每个记录中替换它们,如下所示: 输入:

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

4 个答案:

答案 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=1PROPS=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