0

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

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
...

都是用“|”分隔的数据。对于这个练习,如果第一次上升的年份是空的,我需要替换“||” 与“|未攀登|”

我不能这样做:

%s/||/|unclimbed|/p

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

4

1 回答 1

0

sed s 命令接受指定要替换哪个字段的标志。您可以将其与以下内容一起使用:

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

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

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

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

同样,这些仅作为示范性示例,我对稳健性不做任何声明。

于 2017-11-07T18:58:22.527 回答