【问题标题】:sed match at specific column in text file?sed 在文本文件中的特定列匹配?
【发布时间】:2017-03-20 20:44:46
【问题描述】:

我必须将打印报告中的一些数据导入到可用于迁移到另一个系统的表单中。我似乎陷入了一个小模式:我正在尝试删除报告中从第 128 列开始的字符串 .00 的所有行以及以下行。

我正在使用以下内容:sed '/^\{128\}\.00/,+1 d'inputfile >outputfile

我正在使用 FreeBSD,但遇到 RE 错误:重复运算符操作数无效。如果我尝试通过删除 +1 来删除以下行,我会得到同样的错误,所以我想我错过了一些更基本的东西。

(我确信有人会跳进来说“你应该使用 awk,像这样......”但我有特定的理由尝试使用 sed 来执行此操作。不幸的是,它已经 30 多年了因为我是一个 sed/awk 向导,而且我对他们都一样生疏。8-))

感谢您的帮助。

这是我要匹配的文本的两行示例:

1011-000                                       .00                  .00                .00                .00                  .00
Petty Cash-Shop

请注意,尽管此处换行,但最后一列是 .00 。我通过在 vim 中进行实验得到了列号。我希望执行 sed 命令后这两行都会消失。

我将命令更改为sed '/\.\{128\}\.00/,+1 d'inputfile >outputfile,它们并没有消失。 (但感谢您捕捉到需要的“。”。我不再收到 RE 错误。)

【问题讨论】:

  • 您的{128} 量词修改了^,这没有任何意义。改用.{128}(或正确转义.\{128\}
  • \{128\}前面什么都没有,你要128个什么?
  • “列”的区别是什么?空格、逗号、制表符,还是别的什么?还是您的意思是“角色位置”?无论您想使用 sed 的原因是什么,都是不好的,除非您的键盘上的“a”、“w”和“k”键坏了。 sed 用于对单独的行进行简单的替换,仅此而已。您没有这样做,因此这不是 sed 的工作,而是 awk 的工作,因为您的计算机目前正在通过展示将 sed 用于此类事情的不可移植性来告诉您。
  • @EdMorton:我认为“列”在这里意味着“位置”。
  • @CasimiretHippolyte 他的代码是这样写的,但他的代码不起作用,所以与其浪费时间解决OP没有的问题,恕我直言,最好问为了确定。一个简洁、可测试的示例输入和预期输出的示例(即minimal reproducible example)也会有所帮助。

标签: bash text awk sed


【解决方案1】:

试试这个:

sed '/^.\{127\}\.00/{N;d;}' inputfile > outputfile

如果第 127 个字符之后的下一个字符串是 .00,则使用 N 命令将下一行添加到模式空间,并使用 d 将其删除。

【讨论】:

  • 这给了我一个错误:“d 命令末尾的多余字符”。但是,我可能会遇到 BSD sed 和 Linux/GNU sed 之间差异的问题。感谢您的帮助。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2013-06-29
相关资源
最近更新 更多