使用sed删除行号

时间:2014-03-11 18:13:31

标签: regex bash shell sed

我有一个格式如下的文件:

1         LOAD INTO TABLE
2             TBLNAME
3          (
4          FLDR_NUM                               POSITION(       1         )
5          INTEGER                                      ,
4          FLDR_NUM                               POSITION(       5         )
5          INTEGER                                      
6          )

我需要摆脱行号,读取字段信息并构建类似json的结构。作为第一步,我正在做:

#!/bin/bash
count=1
while read line || [ -n "$line" ]
do
    name=$(sed -e 's/^[0-9][0-9]?\s*//' <<< $line)
    count=$[$count+1]
    # if [ $count -gt 3 ]
    # then
      echo "Name $name"
    # fi
done < $1

这是我想要实现的:基本上删除直到行号后面的第一个非空白字符: 例如第4行:

FLDR_NUM                               POSITION(       1         )

更新了正则表达式。

4 个答案:

答案 0 :(得分:3)

你可以这么多方式做到这一点。其中一个最简单的方法就是单独使用bash:

$ while read num line; do echo "$line"; done < inputfile

这通过将每一行视为由空格分隔的两个变量来工作。第一个是行号。第二个是其他一切。

基于sed的可移植解决方案(即不仅适用于GNU sed)如下所示:

sed -e 's/^[0-9][0-9]*[[:space:]][[:space:]]*//' inputfile

请注意,我们使用BRE构造[[:space:]][[:space:]]*而不是更简单的ERE构造[[:space:]]+,因为每个版本的sed都理解BRE,而不是每个人都理解ERE。

如果在您要删除的数字之前存在空格的风险,则可以在替换的正则表达式中[[:space:]]*之后插入^

答案 1 :(得分:1)

Sed认为你正在使用(元字符(一个组)。要使用文字(,您只需要停止转义它:

sed -e 's/^[0-9][0-9]?\s*(*//'

这似乎是您想要的命令:s/^[0-9][0-9]?\s*//

它将删除行开头的任何一位或两位数字,后跟任意数量的空格。如果您想获得一个或多个数字(而不只是一个或两个),请将[0-9][0-9]?更改为[0-9]\+

$ sed -e 's/^[0-9]\+\s*//' < example.txt

LOAD INTO TABLE
TBLNAME
(
FLDR_NUM                               POSITION(       1         )
INTEGER                                      ,
FLDR_NUM                               POSITION(       5         )
INTEGER                                      
)

编辑:根据@ghoti,这不适用于每个sed实施

答案 2 :(得分:0)

这在sed中并不容易。我的意思是,摆脱领先的数字和空白是很容易的,但你要做的其余事情将是艰难的。

我更有可能选择awk

awk -F'[ )(]+' '
    NF==2 && /[A-Z]/    {print "{ " $2 " => "                   }  # TBLNAME
    NF==5 && $2!="LOAD" {fldr_num=$2; pos=$4                    }  # FLDR_NUM/POSITION
    NF==3               {print "\t" $2 "/" fldr_num "/" pos "," }  # INTEGER
    END                 {print "}"                              }  # Right brace
' infile.foo

这并不是您正在寻找的内容,但它说明了提取您感兴趣的信息并重新格式化/重新格式化的基础知识。

希望这有帮助。

答案 3 :(得分:0)

如果行号是固定宽度,只需

cut -c11- file >file.new

如果你的最终目标是某种解析的JSON输出,那么你用来做实际解析的任何东西都可以很好地跳过行号。