如何在指定的模式sed排除模式后抓取字符串

时间:2017-05-21 04:38:27

标签: bash sed

如何在[split]模式之后修改文件或stdin但是下一个[split]模式没有分隔或排除假设[split]模式可以无限制地发生?

简单地说,第一个[split]模式是如何分隔的,接下来不是?

主要使用sed,如果不能,请使用其他工具,如awk和其他工具。

INPUT:

WATER[split]FIRE[split]AIR[split]

我试过了:

~$ echo WATER[split]FIRE[split]AIR | sed s/.*\\[split]//

我的结果是:

AIR

我想要的OUTPUT是这样的:

FIRE[split]AIR

请问这怎么办?

3 个答案:

答案 0 :(得分:0)

Bash和parameter substitution

$ foo=WATER[split]FIRE[split]AIR[split]
$ bar=${foo#*\[split\]}                      # head off
$ echo ${bar%\[split\]*}                     # tail off
FIRE[split]AIR
  • ${var%Pattern}$var移除$Pattern后端匹配的$var 最短部分}}

  • ${var#Pattern}$var移除$Pattern前端匹配的$var 最短部分}}

答案 1 :(得分:0)

echo WATER[split]FIRE[split]AIR | sed 's/\[split]/[SPLIT2]/; s/.*\[SPLIT2]//'

答案 2 :(得分:0)

假设您没有在多行缓冲区上创建和操作:

$ echo 'WATER[split]FIRE[split]AIR' | sed 's/\[split]/\n/; s/.*\n//'
FIRE[split]AIR

如果您正在使用多行缓冲区,那么您不能指望输入中不存在换行符或任何其他字符,因此您必须创建一个(#以下),以便执行此操作将是:

$ echo 'WATER[split]FIRE[split]AIR' |
    sed 's/@/@A/g; s/#/@B/g; s/\[split]/#/; s/.*#//; s/@B/#/g; s/@A/@/g'
FIRE[split]AIR

第一个脚本仅适用于接受\n作为换行符的seds,其他seds使用反斜杠后跟文字换行符:

$ echo 'WATER[split]FIRE[split]AIR' | sed 's/\[split]/\
/; s/.*\
//'
FIRE[split]AIR