从 A 读取到 B,但在第一次出现 B 时停止



我正在尝试做一个从文件从字符串 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时退出。

旁白:您应该确保信任FROMSTRTOSTR的来源。 如果任一变量包含 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

一个有用的堆栈溢出,解释循环

相关内容

  • 没有找到相关文章

最新更新