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

时间:2016-06-01 16:07:37

标签: string bash shell

我正在尝试执行从脚本A到B字符串的文件读取的shell脚本。字符串A我确定它是UNIQUE,但是B字符串重复了不止一次。

我正在读取包含大量CREATE查询的文件。

每个查询都以(我的字符串B)

结尾
  

); ------------------------

字符串A以这种方式组成:

CREATE MULTISET TABLE DBNAME.TABLENAME

所以我读了从A到B的sed

sed -n "/$FROMSTR/,/$TOSTR/p" $2 >> querytest.txt

我想停止第一次出现$TOSTR(字符串B)

2 个答案:

答案 0 :(得分:3)

取代:

sed -n "/$FROMSTR/,/$TOSTR/p"

使用:

sed -n "/$FROMSTR/,\${p; /$TOSTR/q}"

这会从第一次出现$FROMSTR打印到最后一行$,但会在第一次出现$TOSTR时退出。

除此之外:您应该确信自己信任FROMSTRTOSTR的来源。如果任一变量包含sed-active字符,结果可能不是您想要的。

示例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
); ------------------------

答案 1 :(得分:0)

我解决了我的问题,似乎sed在管理转义字符时遇到了一些问题(\ r \ n)

我将$ TOSTR改为“);”

并使用循环。

sed -n "/$FROMSTR/{p; :loop n; p; /$TOSTR/q; b loop}" $2 >> $3

然后我在“);”

之后回复我需要的字符
echo -e "\r\n--------------------------------------------------------------------------------" >> $3

An useful one on stackoverflow that explain loop