使用sed用符号替换两个字符串之间的空格

时间:2019-08-01 08:49:00

标签: bash awk sed

我有这样的字符串:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)

fig, ax = plt.subplots()

data = np.random.random((512, 512))
im = ax.imshow(data, cmap='jet', interpolation='none', aspect='auto')

plt.show()

我需要用“ |”替换“ Marry Scott Robinson”之间的 only 空格。因此拥有20.07.2010|Berlin|id 100|bd-22.10.94|Marry Scott Robinson|msc@gmail.com

有很多这样的行,所以问题在于仅在名称后面的“ bd-”和垂直线之间替换空白。

4 个答案:

答案 0 :(得分:2)

抢救Perl!

perl -lne '($before, $change, $after) = /(.*\|bd-.*?\|)(.*?)(\|.*)/;
           print $before, $change =~ s/ /|/gr, $after' -- file
  • -n逐行读取输入,为每一行运行代码
  • -l从输入中删除换行符并将其添加到输出中
  • 第一行通过从该行捕获的值填充三个变量。 $before包含直到|之后的第一个bd-的内容; $change包含下一个|之后的内容,$after包含其余内容。
  • s/ /|/gr用竖线替换空格(/g代表“全部”)并返回(/r)结果。

答案 1 :(得分:2)

这可能对您有用(GNU sed):

sed 's/[^|]*/\n&\n/5;:a;s/\(\n[^\n ]*\) /\1\|/;ta;s/\n//g' file

有时要解决问题,我们必须架设脚手架,然后解决原始问题,最后卸下脚手架。

在这里,我们需要通过用换行符将其包围来隔离该字段。

通过循环直到失败,删除换行符之间的空格。

最后,删除脚手架,即引入的换行符。

答案 2 :(得分:2)

我假设名称始终在第五列:

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

如果不是这种情况,可以执行:

awk 'BEGIN{FS=OFS="|"}{for(i=1;i<=NF;i++){if($i ~ /bd-/){break}};gsub(/ /,OFS,$(i+1))}1' file

返回:

20.07.2010|Berlin|id 100|bd-22.10.94|Marry|Scott|Robinson|msc@gmail.com

答案 3 :(得分:0)

另一个perl版本:

$ perl -F'\|' -ne '$F[4] =~ tr/ /|/; print join("|", @F)' foo.txt
20.07.2010|Berlin|id 100|bd-22.10.94|Marry|Scott|Robinson|msc@gmail.com

与Corentin的第一个awk示例相同的基本思想。根据{{​​1}}将每一行分成几列,用|替换第5行中的空格,打印重新连接的行。