![关于 sed 的一个问题](https://linux22.com/image/897003/%E5%85%B3%E4%BA%8E%20sed%20%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98.png)
有人可以帮我用 sed 将文档中的这一行改为全局的吗:
432 |---|1 M a n y - w o r d s !|---| (123.WORDS)
到:
432 |---|1.M.a.n.y.-.w.o.r.d.s.!|---| (123.WORDS)
答案1
如果要更改两个|---|
带点的 之间的所有空格,请使用
sed 'h;s/ /./g;G;s/.*\(|---|.*|---|\).*\n\([^|]*\).*|\(.*\)/\2\1\3/'
1)用以下命令将原始行保存在保持缓冲区中h
2)用以下命令将所有空格替换为点s/ /./g
3)用以下命令从保持空间中附加原始行G
4)最后一个s
命令从中间部分组成最后一行,其中包含替换项,以及不包含替换项的第一位和最后一位。
答案2
尝试这个sed
命令:
sed 's/\s/./g;s/432./432 /;s/!|---|./!|---| /' source.txt
当然,你可以substitution
使用sed -i
sed ... > output.txt
g
:全局选项
答案3
我会使用 Perl 而不是 sed:
perl -naF'/\|/' -e '$F[2] =~ tr/ /./; print join "|", @F'
-n
逐行读取输入-a
将每一行拆分到@F 数组中F '/\|/'
分割时使用文字竖线作为分隔符$F[2]
包含第三列tr
是音译运算符,它将第三列中的空格替换为点join
将数组的列重新连接起来(参见加入)