关于 sed 的一个问题

关于 sed 的一个问题

有人可以帮我用 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 -ised ... > output.txt

g:全局选项

答案3

我会使用 Perl 而不是 sed:

perl -naF'/\|/' -e '$F[2] =~ tr/ /./; print join "|", @F'
  • -n逐行读取输入
  • -a将每一行拆分到@F 数组中
  • F '/\|/'分割时使用文字竖线作为分隔符
  • $F[2]包含第三列
  • tr是音译运算符,它将第三列中的空格替换为点
  • join将数组的列重新连接起来(参见加入

相关内容