sed 获取特定模式并更改它

sed 获取特定模式并更改它

我有包含以下内容的文件

<general id="7" src="xyz" srcType="abc" link="positive" />
<general id="3" src="xyz" srcType="pqr" link="positive" />
..

我试图src用大写单词替换每个名字。例如,在上面我想将所有内容替换xyzXyz(第一个字母是大写)。

预期输出是

<general id="7" src="Xyz" srcType="abc" link="positive" />
<general id="3" src="Xyz" srcType="pqr" link="positive" />
..

尝试过正则表达式模式src="(.*?)"可以从行中提取“xyz”,但如何使用它来sed替换我的文件?

我尝试跟随但它不起作用

sed -E 's/srcName="(.*?)"/Xyz/1' 文件名

奖金问题,我该如何概括它?scr="和之间的任何内容"都可以转换为第一个字符大写的单词。

答案1

要编辑 XML,请使用支持 XML 的工具。例如,有xsh,我采用的维护工具。

open file.xml ;
for //@src set . xsh:subst(., "(.)", "\U$1") ;
save :b ;

答案2

一个支持 XML 的工具绝对是出路!快速破解:

在 GNU 中sed

sed -r 's/src="([a-z])/src="\U\1\E/g'  file.xml

对于更复杂的更改,我建议 Perl

perl -pe 's/src="\K(\w+)/ucfirst($1)/e'   file.xml

在哪里

  • perl -pe command是一个“readline、command、print”循环
  • s/regexp/expression/e 用 eval(表达式) 的结果替换 regexp
  • src="\K 是左上下文模式

答案3

尝试使用 awk 命令,效果很好

awk -F 'src="' '{$2=(toupper(substr($2,1,1))substr($2,2));$2="src="$2;print $0}' filename|sed 's/src=/&"/g'

输出

<general id="7"  src="Xyz" srcType="abc" link="positive" />
<general id="3"  src="Xyz" srcType="pqr" link="positive" />

相关内容