替换文本文件中的一些但不是所有空格(shell / bash)

时间:2016-06-30 08:55:39

标签: bash shell spaces

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

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

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

我想的一个选项是更改名称中的空格并放置一个“低栏”,然后删除文件中的所有空格并写“|”然后再次更改空格名称中的“_”。

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

期望输出将是这个

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

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

$ sed 's/[[:space:]]\([[:digit:]]\)/|\1/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 \1
                              |\1  # Replace with | and captured digit

答案 1 :(得分:1)

您可以使用sed表达式来执行此操作:

sed -i 's/\([[:digit:]]\)\ \([[:digit:]]\)/\1|\2/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命令的第二部分;我可以使用\1\2来引用这两种模式。