我有一个格式如下的文件:
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 )
更新了正则表达式。
答案 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输出,那么你用来做实际解析的任何东西都可以很好地跳过行号。