使用sed删除字符串前后的所有内容

时间:2017-11-30 06:51:57

标签: awk sed

我在下面的表格中有数据: -

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

1 个答案:

答案 0 :(得分:2)

使用sed

尝试:

$ 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

$ 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=""

    这会将输出记录分隔符设置为空字符串。