我有这样的字符串:
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-”和垂直线之间替换空白。
答案 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行中的空格,打印重新连接的行。