我已经看到类似的问题,但是在这种情况下,所有解决方案似乎都不起作用。我有一个看起来像这样的文本文件
START-OF-FILE
RUNDATE=20140910
FIRMNAME=dl
FILETYPE=pc
REPLYFILENAME=TEST
DERIVED=yes
PROGRAMFLAG=oneshot
SECID=ISIN
SECMASTER=yes
PROGRAMNAME=getdata
START-OF-FIELDS
ISSUER
START-OF-DATA
US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |
END-OF-DATA
END-OF-FILE
我正在尝试编写bash shell脚本,以仅提取“ START-OF-DATA”和“ END-OF-DATA”之间的文本(不包括这两者)。所以我正在寻找的输出看起来像这样
US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |
到目前为止,我编写的代码看起来像这样
while read line
do
name=$line
echo $name | sed -e 's/START-OF-DATA\(.*\)END-OF-DATA/\1/'
done < $1
并像这样从bash运行它
./script.sh file.txt
其中script.sh是我将外壳程序脚本另存为的文件,而file.txt是上面读取的文本文件。目前,它只是读取并回显整个文件。我猜它在我的语法中有些愚蠢。朝正确方向的任何指针将不胜感激。谢谢
使用awk
您可以执行以下操作:
awk '/START-OF-DATA/{p=1;next} /END-OF-DATA/{p=0;exit} p' file
US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |
或使用sed
:
sed -n '/START-OF-DATA/,/END-OF-DATA/{/START-OF-DATA\|END-OF-DATA/!p;}' file
US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句