Bash Grep表示线路的一部分并替换
不熟悉Bash,使用grep等,并发现它令人困惑。假设我有一个如下所示的文件:Bash Grep表示线路的一部分并替换,bash,scripting,grep,Bash,Scripting,Grep,不熟悉Bash,使用grep等,并发现它令人困惑。假设我有一个如下所示的文件: ABC: first example [1.0] ---- ABC: second example [1.1] ---- DEF: third example [1.2] ---- DEF: fourth example [1.3] ---- 我如何使用grep获得所有以ABC开头、以example结尾的行,并在example之后删掉行中的所有内容 期望输出 ABC: first example ABC: seco
ABC: first example [1.0] ----
ABC: second example [1.1] ----
DEF: third example [1.2] ----
DEF: fourth example [1.3] ----
我如何使用grep获得所有以ABC开头、以example结尾的行,并在example之后删掉行中的所有内容
期望输出
ABC: first example
ABC: second example
使用GNU
grep
:
grep -o '^ABC.*\<example\>'
示例:
% cat file.txt
ABC: first example [1.0] ----
ABC: second example [1.1] ----
DEF: third example [1.2] ----
DEF: fourth example [1.3] ----
% grep -o '^ABC.*\<example\>' file.txt
ABC: first example
ABC: second example
% grep -Po '^ABC.*\bexample\b(?=[^[:alpha:]]*$)' file.txt
ABC: first example
ABC: second example
%cat file.txt
ABC:第一个示例[1.0]----
ABC:第二个示例[1.1]----
DEF:第三个示例[1.2]----
DEF:第四个示例[1.3]----
%grep-o“^ABC.*”file.txt
ABC:第一个例子
ABC:第二个例子
%grep-Po“^ABC.*\bexample\b(?=[^[:alpha:]*$)”file.txt
ABC:第一个例子
ABC:第二个例子
与GNUgrep
:
grep -o '^ABC.*\<example\>'
示例:
% cat file.txt
ABC: first example [1.0] ----
ABC: second example [1.1] ----
DEF: third example [1.2] ----
DEF: fourth example [1.3] ----
% grep -o '^ABC.*\<example\>' file.txt
ABC: first example
ABC: second example
% grep -Po '^ABC.*\bexample\b(?=[^[:alpha:]]*$)' file.txt
ABC: first example
ABC: second example
%cat file.txt
ABC:第一个示例[1.0]----
ABC:第二个示例[1.1]----
DEF:第三个示例[1.2]----
DEF:第四个示例[1.3]----
%grep-o“^ABC.*”file.txt
ABC:第一个例子
ABC:第二个例子
%grep-Po“^ABC.*\bexample\b(?=[^[:alpha:]*$)”file.txt
ABC:第一个例子
ABC:第二个例子
给定:
$ echo "$txt"
ABC: first example [1.0] ----
ABC: second example [1.1] ----
DEF: third example [1.2] ----
DEF: fourth example [1.3] ----
您可以使用sed
:
$ echo "$txt" | sed -n 's/\(^ABC.*example\).*$/\1/p'
ABC: first example
ABC: second example
如果您的内容在文件中,您将执行以下操作:
$ sed -n 's/\(^ABC.*example\).*$/\1/p' file
说明:
sed -n 's/\(^ABC.*example\).*$/\1/p'
^ don't print unless p directive
^ substitute
^ ^ capture group -- parens need to be escaped
^ ABC at start of line
^ anything up to example
^ everything after example to end of line
^ replace entire line with capture group
^ p means print that if sub made
或者,您可以使用awk
:
$ echo "$txt" | awk 'match($0, /^ABC.* example/){print substr($0, RSTART, RLENGTH)}'
ABC: first example
ABC: second example
如果您想使用(因此示例与示例或非示例不同,*示例仅作为独立单词匹配),您可以执行以下操作:
$ echo "$txt" | sed -n -E 's/(^ABC.*[[:<:]]example[[:>:]]).*$/\1/p'
鉴于:
您可以使用sed
:
$ echo "$txt" | sed -n 's/\(^ABC.*example\).*$/\1/p'
ABC: first example
ABC: second example
如果您的内容在文件中,您将执行以下操作:
$ sed -n 's/\(^ABC.*example\).*$/\1/p' file
说明:
sed -n 's/\(^ABC.*example\).*$/\1/p'
^ don't print unless p directive
^ substitute
^ ^ capture group -- parens need to be escaped
^ ABC at start of line
^ anything up to example
^ everything after example to end of line
^ replace entire line with capture group
^ p means print that if sub made
或者,您可以使用awk
:
$ echo "$txt" | awk 'match($0, /^ABC.* example/){print substr($0, RSTART, RLENGTH)}'
ABC: first example
ABC: second example
如果您想使用(因此示例与示例或非示例不同,*示例仅作为独立单词匹配),您可以执行以下操作:
$ echo "$txt" | sed -n -E 's/(^ABC.*[[:<:]]example[[:>:]]).*$/\1/p'
你不会的。grep不是一个编辑器,它只是查找与regexp匹配的字符串(g/re/p
=全局查找正则表达式并打印结果
),它不用于修改任何内容。要修改文本,应使用sed或awk。虽然GNU的家伙们一直在试图把grep变成一把瑞士军刀,但忽略所有这些,只是按照最初的意图使用grep。我们已经有了其他的UNIX工具。看,你不会的。grep不是一个编辑器,它只是查找与regexp匹配的字符串(g/re/p
=全局查找正则表达式并打印结果
),它不用于修改任何内容。要修改文本,应使用sed或awk。虽然GNU的家伙们一直在试图把grep变成一把瑞士军刀,但忽略所有这些,只是按照最初的意图使用grep。我们已经有了其他的UNIX工具。请参阅。您应该提到这是GNU特有的,-P
是高度实验性的,因此YMMV。单词边界断言\此外,-o
本身是GNU扩展。请看,您应该提到这是GNU特有的,-P
是高度实验性的,因此YMMV。单词边界断言\此外,-o
本身是GNU扩展。看见