我想从多行文件中提取文本。例如 我需要从"第1.0节"中提取所有文本。到"第3.0节"
这可以在很多方面。
我的代码有效,但看起来很笨拙和缓慢。有一个更好的方法吗? SED? reg表达?
flag="false"
for line in ${textFile};
do
if [ "$line" == "Section 3.0" ]; then
flag="false"
fi
if [ "$flag" == "true" ]; then
temp_var+=$line
fi
if [ "$line" == "Section 1.0" ]; then
flag="true"
fi
done
答案 0 :(得分:3)
使用sed你可以这样做:
sed -n '/Section 1\.0/,/Section 3\.0/p' file
编辑:要忽略开始和结束模式,请使用:
sed -n '/Section 1\.0/,/Section 3\.0/{/Section [13]\.0/!p;}' file
awk解决方案:
awk '/Section 1\.0/{flag=0} flag{print} /Section 3\.0/{flag=1}' file
答案 1 :(得分:2)
sed -n '/Section 1\.0/,/Section 3\.0/p' file
将从file
打印与第一个正则表达式匹配的行之间的所有行,通过与第二个表达式匹配的下一行。如果有多个这样的匹配,它们将以翻转方式打印(查找模式1,通过模式2打印,查找模式1 ......)
如果您只想要第一个这样的部分,则可以在找到结束条件时退出:
sed -n '/Section 3\.0/q;/Section 1\.0/,$p' file
这将排除与结束条件匹配的行(猜测那是你真正想要的)。为简单起见,假设您在1.0节之前没有第3.0节。 (某些sed
方言可能需要略有不同的语法;分号可能必须更改为换行符,或者脚本分为两个单独的-e
个参数。)
答案 2 :(得分:0)
awk
也可以使用:
awk '/Section 3\.0/{f=0} f; /Section 1\.0/{f=1}' file