我在下面的表格中有数据: -
The symbol ":=" was substituted for "QUERY" to continue.
SQL> _id : MS
itm : 4
it : NO
------
PL/SQL procedure successfully completed.
我想删除_id之前和之后------的所有内容。
要删除_id之前的所有内容,我使用了以下sed
sed '/_id/,$!d' 1.txt
删除_id之前的行,但不删除SQL>
同样地,我使用下面的sed来删除------之后的所有内容,但它不会删除它下面的行
sed 's/\------.*/------/' 1.txt
在我做错的地方有人可以帮助我吗?我需要的是: -
_id : MS
itm : 4
it : NO
答案 0 :(得分:2)
尝试:
$ sed -n '/_id/,/------/{ s/.*_id/_id/; /------/q; p}' 1.txt
_id : MS
itm : 4
it : NO
工作原理:
-n
除非我们明确要求,否则告诉sed不要打印。
/_id/,/------/{...}
这会选择以包含_id
的行开头并以包含------
的行结束的行范围。对于那些行,执行花括号中的命令。
s/.*_id/_id/
在包含_id
的行中,这会移除_id
之前的所有内容。
/------/q
在包含------
的行上,这告诉sed退出。
p
对于到达此命令的行,这会告诉sed打印该行。
$ awk -v RS='------' '/_id/{sub(/.*_id/, "_id"); print}' ORS="" 1.txt
_id : MS
itm : 4
it : NO
工作原理:
-v RS='------'
将------
设为记录分隔符。
/_id/{sub(/.*_id/, "_id"); print}
对于包含_id
的所有记录,我们会移除_id
之前的所有内容并打印当前记录。
ORS=""
这会将输出记录分隔符设置为空字符串。