linux 两个字符串之间,关于linux:使用bash shell脚本在2个字符串之间提取字符串...

我已经看到类似的问题,但在这种情况下似乎没有一个解决方案。 我有一个看起来像这样的文本文件

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是我保存的shell脚本,而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| | |

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

为了使你的解决方案有效,你可以在点击"START-OF-DATA"时读取"True"(或类似),然后在点击"END-OF-DATA"时结束它。 使用此标记,当标记读为"True"时(当您在相关文本块内时),您可以告诉echo打印。

...或者您可以使用sed:

sed -n '/START-OF-DATA/,/END-OF-DATA/ { //!p }' file.txt

谢谢bryn的回复。 您的解决方案完美无缺 我不得不赞成@anubhava,因为他的回复有点快。 谢谢。 让脚本现在运行正常。 问候

嗨布莱恩。 你的sed命令行比anubhava的命令行好。 但对我来说有点神秘:我想知道//在{ //!p }中意味着什么。 请给出一些解释或链接到解释这个的网站。 干杯;-)

我想添加perlish grep方式,如下所述:

grep -Pzo"(?s)START-OF-DATA.*END-OF-DATA""$1"

这仍然包括START-OF-DATA和END-OF-DATA标记。 要摆脱它们,模式必须变得不那么可读:

grep -Pzo"(?s)(?<=START-OF-DATA

).*(?=

END-OF-DATA)"

(?<=START-OF-DATA

)和(?=

END-OF-DATA)是perlre中描述的环视断言,即它们用于匹配,但不包括在结果中。

很高兴使用prep,但打印START-OF-DATA和END-OF-DATA行: - /请尝试改进命令行以避免打印这两行。 玩得开心:-)干杯

@olibre:谢谢你指出这一点。 我添加了改进的命令行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值