我正在尝试执行从脚本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)
答案 0 :(得分:3)
取代:
sed -n "/$FROMSTR/,/$TOSTR/p"
使用:
sed -n "/$FROMSTR/,\${p; /$TOSTR/q}"
这会从第一次出现$FROMSTR
打印到最后一行$
,但会在第一次出现$TOSTR
时退出。
除此之外:您应该确信自己信任FROMSTR
和TOSTR
的来源。如果任一变量包含sed-active字符,结果可能不是您想要的。
举个简单的例子:
$ FROMSTR=2; TOSTR=4; seq 10 | sed -n "/$FROMSTR/,\${p; /$TOSTR/q}"
2
3
4
作为更接近实际输入的示例,请考虑此测试文件:
$ 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
); ------------------------
考虑这个测试文件:
$ 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