使用 sed 进行多次匹配,而不是匹配整个文件

使用 sed 进行多次匹配,而不是匹配整个文件

我有文件

0::question#1::
Love
giberrish fdfd

1::anything#2:
Is
repeat

22::anything#3::
Lie

我想提取

Love
giberish
****
Is 
repeat
****
Lie

cat file.txt | sed 's/::\n([^\n]*)/\1/g'

我得到的文件是

0::question#1::
Love

1::anything#2:
Is

22::anything#3::
Lie

测试正则表达式是否匹配 https://regex101.com/

更新 我忘了说了,文件提取是针对多行的,而不是单行的,而且我还想要一个分隔符。很抱歉给您带来麻烦

cat org_op.2019.04.06-09.43.59 | sed 's/^.*::.*//g;/^$/d'

我得到的输出为

Love
giberrish fdfd
Is
repeat 2 4 4
Lie

因此我添加了一些内容deliminator ,以便将一条记录与另一条记录分开

cat org_op.2019.04.06-09.43.59 | sed 's/^.*::.*/***/g;/^$/d'

并得到

 ***
Love
giberrish fdfd
 ***
Is
repeat 2 4 4
 ***
Lie

为了删除顶线我使用

cat org_op.2019.04.06-09.43.59 | sed 's/^.*::.*/ ***/g;/^$/d' | tail -n +2

新的输出是

  Love
  giberrish fdfd
  ***
  Is
  repeat 2 4 4
  ***
  Lie

我想使用awki did捕获每条记录

cat org_op.2019.04.06-09.43.59 | sed 's/^.*::.*/ ***/g;/^$/d' | tail -n +2 | awk 'BEGIN{ RS = "" ; FS = "***" }{print $1}'

我得到输出

Love
giberrish fdfd

我无法删除所有字段中相同的最后一个空行,我尝试使用管道符 sed 但/^$/d没有成功

更新2 让它工作

``sed 's/^.::.//g;/^$/d' | tail -n +2 | awk'BEGIN{ RS =“”; FS =““}{打印$1}'|sed-e'/^$/d'`

答案1

sed '/^[0-9]/d; /^$/d' file.txt
Love
Is
Lie
  • /^[0-9]/d:删除以数字开头的行
  • /^$/d:删除空行

答案2

使用匹配行的方法然后删除那些匹配的行然后删除空格......

sed -e '/^.*::.*/d' -e '/^$/d' data.txt

结果:

Love
Is
Lie

或者更短的版本:

sed -E '/^(.*::.*)?$/d'

信息:

  • '/^.*::.*/d':匹配行::并删除它们
  • '/^$/d':删除所有空白行

相关内容