如何仅在一系列列中查找和替换?

如何仅在一系列列中查找和替换?

我有一个包含 9267 行的文本文件。我想找到后面有5个空格的“A”并将其替换为有5个空格的“A”之前和之后它出现在所有行上,但仅限于第 67 列和第 88 列之间。需要排除这些列之外的文本。我希望sed和/或awk可以在这里提供帮助,尽管我不知道如何很好地使用它们。


详细信息:我正在将 128 页的 PDF 转换为电子表格。我使用 PDFedit 将 PDF 保存为文本文件。我计划使用 LibreOffice 插入“文件中的工作表”。事实证明,这很困难,因为虽然 PDF 中的列排列得很好,但电子表格类型的列在整个文本文件中并不位于完全相同的文本文件类型列中。每 50 行左右相当于一个不同的 PDF 页面,电子表格类型的列可能会向左或向右移动一些文本文件类型的列。换句话说,“Shelf”的电子表格类型列可以在文件的一部分中从文本文件类型列70开始,但在另一部分中从文本文件类型列76开始。这使得当我尝试将“固定宽度”插入 LibreOffice 时,电子表格类型的列会重叠。我想通过查找和替换添加空格来使列更加分散,这样我就可以告诉 LibreOffice 在哪里定义列。如果我查找并替换整个文件,我最终会在不需要的地方放置空格。


这是一个相当准确的例子:

Item Code             Active Description                                Store Room      Row      Shelf     Bin  On Hand   
 38NUTZSL                Y      3/8"-16 HEX ZINC NUT                     B            03           C         2         0  
 WELD-AL                 Y      WELD, ALUM. ROD, STICK OR SPOOL          A            01             B       2         68.25  
 08300                   Y      WASHER, 7/8 CASE HARDENED 29/32 ID,1 3/4 OD  A            01        C            5         0

答案1

更改列分隔符并使用column命令的更好方法:

sed 's/   */;/g' file | column -ts';'

产生:

Item Code  Active  Description                                  Store Room  Row  Shelf  Bin  On Hand
 38NUTZSL  Y       3/8"-16 HEX ZINC NUT                         B           03   C      2    0
 WELD-AL   Y       WELD, ALUM. ROD, STICK OR SPOOL              A           01   B      2    68.25
 08300     Y       WASHER, 7/8 CASE HARDENED 29/32 ID,1 3/4 OD  A           01   C      5    0

相关内容