如何删除文件中特定字符串前后的所有行?

如何删除文件中特定字符串前后的所有行?

我玩过 Powergrep 和正则表达式,但我不知道该怎么做:

我有文本文件(网页源代码),我想删除代码中特定字符串(html 标签)之前的所有文本(很多行)STRING1以及另一个特定字符串之后的所有文本:STRING2。这些字符串在源代码中仅出现一次。

答案1

Ctrl按+ Alt+打开终端T,然后使用下面一行命令之一。不要忘记将输入文件名更改为您自己的文件名。

使用

awk -v FS="(STRING1|STRING2)" '{print $2}' inputfile > outputfile

使用

grep -Pzo "(?<=STRING1)(.|\n)*(?=STRING2)" inputfile > outputfile

(点匹配换行符)修饰符。它使得.匹配甚至\n新的换行符。

grep -Pzo "(?s)(?<=STRING1).*?(?=STRING2)" inputfile > outpuffile

激活(?s)grep 的 DOTALL。

或者作为匹配\n新行字符的另一种方法,只需使用:

grep -Pzo "(?<=STRING1)[\s\S]*(?=STRING2)" inputfile > outpuffile

人grep

-o, --only-matching
      Print only the matched (non-empty) parts of a matching line,
      with each such part on a separate output line.

-P, --perl-regexp
      Interpret PATTERN as a Perl compatible regular expression (PCRE)

-z, --null-data
      Treat the input as a set of lines, each terminated by a zero byte (the ASCII 
      NUL character) instead of a newline. Like the -Z or --null option, this option 
      can be used with commands like sort -z to process arbitrary file names.

(?<=pattern): 作为。。而被知道积极回顾. 一对括号,左括号后跟问号、“小于”符号和等号。

因此,(?<=STRING1).*?(正向后视)匹配 0 次或多次出现的任何字符(由于使用?after ,因此是可选的.*),后跟STRING1from输入文件

(?=pattern): 作为。。而被知道积极展望:正向前瞻构造是一对括号,左括号后跟问号和等号。

因此,.*?(?=STRING2):(正向前瞻)匹配 0 次或多次后跟 的任何字符STRING2


更多阅读链接:
高级 Grep 主题
面向设计师的 GREP

答案2

你可以用以下命令执行此操作:

sed -e '/STRING1/,/STRING2/!d' inputfile > outputfile

相关内容