使用Bash删除文件中匹配文本之前的所有文本

时间:2014-06-03 16:28:51

标签: bash

我在文件中有以下文字,我希望找到单词fox,并希望从文本开头删除单词fox之前的文字。 (包括狐狸)

如果没有匹配,我想保留整个文字。

The quick 
brown fox 
jumps over 
the lazy dog

要求的结果将是:

jumps over 
the lazy dog

要使用的工具并不重要,但我在Windows上使用Msys,而不是所有的花哨工具都在这里实现。

我尝试的事情:

var=$(echo "${raw}" | awk "/replaceme/{i++}i")
var=$(echo "${raw}" | sed -n "/replaceme/,${p}")
var=$(echo "${raw}" | sed -r -n -e "/replaceme/,${p}")
var=$(echo "${raw}" | sed "/replaceme/,$!d")

由于

3 个答案:

答案 0 :(得分:2)

您可以在awk

中轻松完成此操作
awk -v s="fox" '$0~s{re="^.*" s "[[:space:]]*"; sub(re, ""); }1' RS= file
jumps over
the lazy dog

未找到模式时

awk -v s="box" '$0~s{re="^.*" s "[[:space:]]*"; sub(re, ""); }1' RS= file
The quick
brown fox
jumps over
the lazy dog

编辑:如果您想删除匹配后的文字(包括匹配线):

awk -v s="over" '$0~s{re="\n[^\n]*" s ".*$"; sub(re, ""); }1' RS= file
The quick
brown fox

答案 1 :(得分:0)

如果只是第一次出现fox,您可以:

sed '1,/fox/d' file

如果要修改文件,请添加-i作为选项。

删除最后一次出现的行:

awk 'BEGIN{start=1}{a[NR]=$0}/fox/{start=NR+1}END{for(i=start;i<=NR;++i)print a[i]}' file

修改:

awk 'BEGIN{start=1;file=ARGV[1]}{a[NR]=$0}/fox/{start=NR+1}END{printf("")>file;for(i=start;i<=NR;++i)print a[i]}>file' file

答案 2 :(得分:0)

您可以使用/^.*fox(.+)|.+/s下载正则表达式路径。

这样,它会从fox的最后一次出现后的文本中获取所有内容,如果没有找到,则会包含所有内容。