如何使用sed替换文件中每行上的字符串之前的第n个空格

时间:2016-02-19 07:42:42

标签: regex awk sed

我正在尝试使用sed用逗号替换文件每行上的姓氏前的空格。

示例来源:

George W Heong§New York§USA
Elizabeth Black§Sheffield, Yorkshire§England
Lucy Jones§Cardiff§Wales
James G K Shackleton§Dallas, Texas§USA
Carl Seddon§Canberra,Australia

示例输出:

George W,Heong§New York§USA
Elizabeth,Black§Sheffield, Yorkshire§England
Lucy,Jones§Cardiff§Wales
James G K,Shackleton§Dallas, Texas§USA
Carl,Seddon§Canberra,Australia

我想我已经找到了一种获取相关空间索引的方法,如下所示:

int idx$ = str.indexOf("§");
int nthSpace = str.lastIndexOf(" ", idx$);

但我还没有弄清楚如何用变量nthSpace替换第n个实例。到目前为止,这是:

sed "s/$nthSpace" "/,/" datain.txt > dataout.txt

任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

使用GNU gensub中提供的awk,您可以执行此操作:

awk 'BEGIN{FS=OFS="§"} {$1=gensub(/[[:blank:]]([^[:blank:]]+)$/, ",\\1", 1, $1)} 1' file

<强>输出:

George W,Heong§New York§USA
Elizabeth,Black§Sheffield, Yorkshire§England
Lucy,Jones§Cardiff§Wales
James G K,Shackleton§Dallas, Texas§USA
Carl,Seddon§Canberra,Australia

答案 1 :(得分:1)

使用sed:

sed 's/ \([^ ]*§\)/,\1/' sourcefile

该模式寻找第一次出现:

  • 空格
  • 后跟任何非空格字符
  • 后跟§

在替换中使用的组中捕获名称,以,为前缀

更新:

要防止匹配name §的字符串,您可以使用s/ +§/§/预处理第一次替换。最后的命令是:

sed 's/ +§/§/;s/ \([^ ]*§\)/,\1/' sourcefile

正如问题评论中所注意到的,如果不手动重写,多部分姓氏(用空格分隔)将被拆分。