使用bash shell脚本在2个字符串之间提取字符串

tas*_*ear 5 linux string bash shell

我见过类似的问题,但在这种情况下似乎没有一个解决方案可行.我有一个看起来像这样的文本文件

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
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个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| | |
Run Code Online (Sandbox Code Playgroud)

到目前为止我写的代码看起来像这样

while read line
do
    name=$line

    echo $name | sed -e 's/START-OF-DATA\(.*\)END-OF-DATA/\1/'

done < $1
Run Code Online (Sandbox Code Playgroud)

并从bash中运行它

./script.sh file.txt
Run Code Online (Sandbox Code Playgroud)

其中script.sh是我保存的shell脚本,而file.txt是它读取的上面的文本文件.目前它只是读取并回显整个文件.我猜测我的语法中有些愚蠢.任何指向正确方向的人都会非常感激.谢谢

anu*_*ava 5

使用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| | |
Run Code Online (Sandbox Code Playgroud)

或使用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| | |
Run Code Online (Sandbox Code Playgroud)

  • 那很棒.正是我正在寻找的......你们这些我已经快速脱离了我必须说:)再次感谢 (2认同)