替换文本文件中的部分但不是全部空格 (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
假设我有一个具有以下结构的文件 (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