使用sed替换第n个和第(n + 1)个分隔符之间的文本

时间:2017-09-25 14:00:26

标签: regex bash unix sed

我想知道如何更改管道分隔数据集中特定位置的单个值。

例如,我有数据集:

01|456|AAAA|James Bond|AAAA|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|AAAA|6296903
04|3213|AAAA|AAAA|BBBB|62969

我想改变每一个" AAAA"值为" XXXX",但仅限于第4和第5个管道符号(|)之间。因此,预期输出将如下所示:

01|456|AAAA|James Bond|XXXX|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|XXXX|6296903
04|3213|AAAA|AAAA|BBBB|62969

仅使用sed函数是否可以实现,或者是否需要使用awk之类的内容。

4 个答案:

答案 0 :(得分:1)

最好使用awk

awk 'BEGIN{FS=OFS="|"} {gsub(/A/, "X", $5)} 1' file

01|456|AAAA|James Bond|XXXX|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|XXXX|6296903
04|3213|AAAA|AAAA|BBBB|62969
  • BEGIN{FS=OFS="|"}使用竖管作为输入&输出字段分隔符
  • gsub(/A/, "X", $5)将每个A替换为X中的$5仅限第5列
  • 1是打印每一行的默认操作

答案 1 :(得分:1)

awk -v start=4 -v end=5 'BEGIN{FS=OFS="|"}{for(i=start;i<=end;i++) gsub(/AAAA/,"XXXX",$i)}1' inputfile
01|456|AAAA|James Bond|XXXX|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|XXXX|6296903
04|3213|AAAA|XXXX|BBBB|62969

根据startend变量的值,gensub函数将在这些值之间的列之间进行替换。

答案 2 :(得分:1)

设置输入字段分隔符(FS),输出字段分隔符(OFS),如果第5列包含AAAA,则替换为XXXX

awk 'BEGIN{FS=OFS="|"} $5=="AAAA" {$5="XXXX"}1' file

输出:

01|456|AAAA|James Bond|XXXX|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|XXXX|6296903
04|3213|AAAA|AAAA|BBBB|62969

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;s/^(([^|]*\|){4}X*)[^X|]/\1X/;ta' file

迭代,从第四个X字符替换非|X的所有字符到|