替换文本文件中的部分但不是全部空格 (shell/bash)

Replace some but not all spaces in text file (shell/bash)

假设我有一个具有以下结构的文件 (example.txt):

NAAME 111 2222 333
NAMME 111 22 333 
NNA ME 444 555 2
NNAAME 1 5 8
N MEEE 44 66 111

我想用分隔符替换数字之间的 space,例如 |, 但不影响名称。

我考虑的一个选择是更改名称中的 space 并放置一个 "low bar",然后删除文件中的所有 space 并写入“|”然后再次将名称中的“_”更改为 space。

知道如何在 shell 中做到这一点吗?或者更好的选择?

期望的输出是这样的

NAAME|111|2222|333
NAMME|111|22|333 
NNA ME|444|555|2
NNAAME|1|5|8
N MEEE|44|66|111

非常感谢!

您可以使用 sed 表达式来做到这一点:

sed -i 's/\([[:digit:]]\)\ \([[:digit:]]\)/|/g' file.txt

输出:

NAME1|111|2222|333
NAME2|111|22|333
NA ME3|444|555|2
NAME4|1 5|8
N ME5|44|66|111

sed命令的解释:

  • -i:就地:修改file.txt
  • [[:digit:]] :如你所想:匹配一个数字
  • \(<patter>\) :将转义括号 \(\) 之间的内容括起来,使它们成为可以引用的 模式 。因为我用过两次;在 sed 命令的第二部分;我可以使用 </code> 和 <code> 来指代这两个模式。

您可以替换所有后跟数字的空格:

$ sed 's/[[:space:]]\([[:digit:]]\)/|/g' file
NAME1|111|2222|333
NAME2|111|22|333 
NA ME3|444|555|2
NAME4|1|5|8
N ME5|44|66|111

细分:

s/                          /   /g # Global substitute command
  [[:space:]]                      # Match a space
               [[:digit:]]         # Match a digit
             \(           \)       # Capture in 
                              |  # Replace with | and captured digit