如何调整特定字符串后面的字符之间的间距?

如何调整特定字符串后面的字符之间的间距?

我有一个大文件~/foo.txt。数千行表格

SIZE : X  Y

分散在整个文件中,其中XY是整数。我的问题是,有时整数XY被两个空格分隔,有时它们被一个空格分隔。我想写一个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

相关内容