首页 > 解决方案 > Linux删除第一行空格

问题描述

我有文件 virt.txt 包含:

0302        000000       23071SOCIETY              117
0602        000000000000000001 PAYMENT              BANK

我只想从第 6 列到第 8 列删除 3 个空格到第一行。

我愿意:

 sed '1s/[[:blank:]]+[[:blank:]]+[[:blank:]]//6' virt.txt

请帮忙

标签: linuxsed

解决方案


您的正则表达式将从三个或更多的序列中消耗所有可用的空白(以一种非常低效的方式)并替换第六次出现. 因为您的第一行输入不包含六个或更多单独的三个或更多空白字符的延伸,所以它实际上什么也没做。但实际上sed,您可以完全按照您所说的去做:

sed '1s/^\(.....\)   /\1/' virt.txt

(或为方便起见,如果您有sed -Esed -r在某些平台上工作的变体,但这些都不是标准的):

sed -E '1s/^(.{5}) {3}/\1/' virt.txt  # -E is not portable

括号将前五个字符捕获到反向引用中,然后我们使用第一个反向引用\1作为替换字符串,有效地仅替换括号外匹配的文本。

如果您sed支持该-i选项,则可以使用该选项直接修改文件;但这也不是标准的,因此最便携的解决方案是将结果写入一个新文件,然后如果要替换它,则将其移回原始文件的顶部。

sed如果您熟悉它会很方便,但显然您不熟悉,也许更好的方法是使用不同的语言,理想情况下,这种语言对于许多用户来说不是只写的,例如sed.

如果您知道这三个字符将始终是空格,只需进行静态替换。

awk 'NR==1 { $0 = substr($0, 1, 5) substr($0, 9) } 1' virt.txt

在第一行(NR是当前输入行号)上,将输入行替换为$0要剪切的部分两侧的子字符串的串联。

对于这样的简单替换,您还可以使用基本的 Unix 文本操作实用程序,尽管它效率低下且不优雅:

head -n 1 virt.txt | cut -c1-5,9- >newfile.txt
tail -n +2 virt.txt >>newfile.txt

如果您需要检查这三个字符是否为空格,则只需对 awk 脚本稍作调整即可。

awk 'NR==1 && /^.{5} {3}/ { $0 = substr($0, 1, 5) substr($0, 9) } 1' virt.txt

您应该模糊地认出上面的正则表达式。awk 不太简洁,但因此也比sed.


推荐阅读