我玩过 Powergrep 和正则表达式,但我不知道该怎么做:
我有文本文件(网页源代码),我想删除代码中特定字符串(html 标签)之前的所有文本(很多行)STRING1
以及另一个特定字符串之后的所有文本:STRING2
。这些字符串在源代码中仅出现一次。
答案1
Ctrl按+ Alt+打开终端T,然后使用下面一行命令之一。不要忘记将输入文件名更改为您自己的文件名。
使用awk:
awk -v FS="(STRING1|STRING2)" '{print $2}' inputfile > outputfile
使用grep:
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 ,因此是可选的.*
),后跟STRING1
from输入文件。
(?=pattern)
: 作为。。而被知道积极展望:正向前瞻构造是一对括号,左括号后跟问号和等号。
因此,.*?(?=STRING2)
:(正向前瞻)匹配 0 次或多次后跟 的任何字符STRING2
。
更多阅读链接:
高级 Grep 主题
面向设计师的 GREP
答案2
你可以用以下命令执行此操作:
sed -e '/STRING1/,/STRING2/!d' inputfile > outputfile