linux - Linux删除第一行空格
问题描述
我有文件 virt.txt 包含:
0302 000000 23071SOCIETY 117
0602 000000000000000001 PAYMENT BANK
我只想从第 6 列到第 8 列删除 3 个空格到第一行。
我愿意:
sed '1s/[[:blank:]]+[[:blank:]]+[[:blank:]]//6' virt.txt
请帮忙
解决方案
您的正则表达式将从三个或更多的序列中消耗所有可用的空白(以一种非常低效的方式)并替换第六次出现的. 因为您的第一行输入不包含六个或更多单独的三个或更多空白字符的延伸,所以它实际上什么也没做。但实际上sed
,您可以完全按照您所说的去做:
sed '1s/^\(.....\) /\1/' virt.txt
(或为方便起见,如果您有sed -E
或sed -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
.
推荐阅读
- python - 验证失败:z3 python 上的 !m_var2expr.empty()
- python - 使用 Python 从星系照片中删除背景
- javascript - 使特定的表格可滚动?
- c - 由于 unsigned int 变量类型在 c 中有无限循环时会发生什么
- python - 在Python中将垂直系列重塑为水平系列
- javascript - 引用静态方法内部的类而不使用其名称
- javascript - 将变量从 javascript 传递给 python,无需重新加载页面
- javascript - Non-greedy capturing parenthesis
- python-3.x - 如何为 CIFAR 10 pytorch 教程添加 GPU 计算?
- amazon-web-services - 如何通过节点红色 MQTT 设置 AWS SNS 电子邮件的电子邮件主题?