我正在尝试做一个从文件从字符串 A 读取到 B 字符串的 shell 脚本。字符串 A 我确定这是唯一的,但 B 字符串重复不止一次。
我正在读取一个包含大量 CREATE 查询的文件。
每个查询都以 (我的字符串 B) 结尾
);------------------------
字符串 A 是这样组成的:
CREATE MULTISET TABLE DBNAME.TABLENAME
所以我用 sed 从 A 到 B 阅读
sed -n "/$FROMSTR/,/$TOSTR/p" $2 >> querytest.txt
我想停止到$TOSTR
的第一个出现(字符串 B)
代替:
sed -n "/$FROMSTR/,/$TOSTR/p"
用:
sed -n "/$FROMSTR/,${p; /$TOSTR/q}"
这将打印从第一次出现的$FROMSTR
到最后一行$
,只是当它看到第一次出现$TOSTR
时退出。
旁白:您应该确保信任FROMSTR
和TOSTR
的来源。 如果任一变量包含 sed 活动字符,则结果可能不是您想要的。
例 1
举个简单的例子:
$ FROMSTR=2; TOSTR=4; seq 10 | sed -n "/$FROMSTR/,${p; /$TOSTR/q}"
2
3
4
例 2
作为更接近实际输入的示例,请考虑以下测试文件:
$ cat file
1
CREATE MULTISET TABLE DBNAME.TABLENAME
2
3
); ------------------------
4
并运行以下命令:
$ FROMSTR="CREATE MULTISET TABLE DBNAME.TABLENAME"
$ TOSTR="); ------------------------"
$ sed -n "/$FROMSTR/,${p; /$TOSTR/q}" file
CREATE MULTISET TABLE DBNAME.TABLENAME
2
3
); ------------------------
例 3
请考虑以下测试文件:
$ cat file
1
CREATE MULTISET TABLE DBNAME.TABLENAME
2
); ------------------------
); ------------------------
3
CREATE MULTISET TABLE DBNAME.TABLENAME
4
); ------------------------
5
我们定义我们的变量:
$ FROMSTR="CREATE MULTISET TABLE DBNAME.TABLENAME"
$ TOSTR="); ------------------------"
并且,运行我们的代码:
$ sed -n "/$FROMSTR/,${p; /$TOSTR/q}" file
CREATE MULTISET TABLE DBNAME.TABLENAME
2
); ------------------------
我解决了我的问题,似乎 sed 在管理转义字符方面存在一些问题 (\r)
我将$TOSTR更改为");"
并使用了一个循环。
sed -n "/$FROMSTR/{p; :loop n; p; /$TOSTR/q; b loop}" $2 >> $3
然后我回显我需要的字符在");"
echo -e "rn--------------------------------------------------------------------------------" >> $3
一个有用的堆栈溢出,解释循环