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

不熟悉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: 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:第二个例子

与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:第二个例子
给定:

$ 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扩展。看见