每行替换特定位置的字符

时间:2017-11-07 18:01:33

标签: linux gnu ed

我们有一个练习,我们必须使用以下文本文档做某些事情:

Rank|Mountain|Height (m)|Height (ft)|Prominence (m)|Range|Coordinates|Parent mountain|First ascent|Ascents (failed attempts)|Country
1|Mount Everest/Sagarmatha/Chomolungma|8,848|29,029|8,848|Mahalangur Himalaya|27°59'17"N 86°55'31"E|none|1953|>>145 (121)|Nepal/China
2|K2/Qogir/Godwin Austen|8,611|28,251|4,020|Baltoro Karakoram|35°52'53"N 76°30'48"E|Mount Everest|1954|45 (44)|Pakistan/China
...
40|Gangkhar Puensum|7,570|24,836|2,995|Kula Kangri Himalaya|28°02'50"N 90°27'19"E|Kangchenjunga||0 (3)|Bhutan/China
...
93|Labuche Kang III/East|7,250|23,786|570|Labuche Himalaya|28°18'05"N 86°23'02"E|Labuche Kang||0 (0)|China
...

所有数据都以“|”分隔。 对于本练习,如果第一次上升的年份为空,我需要替换“||”用“| unclimbed |”

我不能这样做:

%s/||/|unclimbed|/p

因为那会取代其他空字段。 所以我的问题是,我该如何仅替换该特定字段?

1 个答案:

答案 0 :(得分:0)

sed s命令接受指定要替换的字段的标志。您可以使用以下内容:

sed '/||[^|]*|[^|]*$/s/|[^|]*/|unclimbed/8'

做你想做的事情(我没有声明这个表达式的健壮性,并且完全期望有失败的边缘情况)。

另一方面,awk非常适合这种情况,您可以执行以下操作:

awk '$9==""{$9 = "unclimbed"}1' FS=\| OFS=\| input

同样,这些仅作为说明性示例,并且我没有提出关于稳健性的声明。