我有一个大文件~/foo.txt
。数千行表格
SIZE : X Y
分散在整个文件中,其中X
和Y
是整数。我的问题是,有时整数X
和Y
被两个空格分隔,有时它们被一个空格分隔。我想写一个perl脚本,使间距一致,最好有两个空格。我该怎么办呢?
答案1
你说的是整数,但我怀疑你的意思是正数。这是一个粗略的快速尝试解决方案:
sed 's/\([0-9]\+\)\s\+\([0-9]\+\)/\1 \2/g'
这里有一些警告,例如第二个数字是否以负号开头,或者是否有空格不例如,希望像这样处理发生在a53
和之间的情况27B
。或者如果你不想全部数字之间用两个空格分隔。但这是一个您可以随意修改的开始。
重新阅读您的问题,似乎您想要“挤压”的所有空格都专门出现在以“SIZE”一词开头的行上。这使得事情变得简单得多。您说要保留“连续空格的其他实例”,但听起来这些在其他行上。所以在这种情况下只需使用:
sed '/^SIZE/ s_\s\s\+_ _'
(替换文本中有两个空格。)
再次重读,我现在看到你想要修复一空格变为两个空格。这更多地取决于行的具体格式,但我想说:
sed '/^SIZE/ s_\s\+_ _3'
应该这样做。 (它适用于您提供的示例。)这3
使得替换仅发生在第三名匹配\s\+
- 正如 Chaos 所解释的,这意味着“一个或多个空格或制表符”。所以在 中SIZE<space>:<space>X<space>Y
,它将把 X 和 Y 之间的空间变成两个空间。
答案2
和sed
:
sed -i 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
-i
就地编辑文件。[0-9]
:搜索数字。\s+
:该数字后跟一个空格或制表符。[0-9]
: ,然后再次跟一个数字。\1 \2
这两个数字保存在反向引用中\1
,\2
现在由两个空格分隔。
例子:
$ cat file
SIZE : 2 1 # 2 spaces
SIZE : 1 22 # 1 space
SIZE : 1 1 # 4 spaces
SIZE : 324 34 # a tab
SIZE : 324 34 # 2 tabs
$ sed 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
SIZE : 2 1
SIZE : 1 22
SIZE : 1 1
SIZE : 324 3
SIZE : 324 34
答案3
sed 's/\([0-9] \) *\([-+.]*[0-9]\)/\1 \2/g' <in >out