【问题标题】:egrep to print lines with one and only one tegrep 打印只有一个 t 的行
【发布时间】:2019-05-06 14:36:12
【问题描述】:

我正在尝试打印只有一个 t 或只有一个 T 的行,其他都可以。 IE没有没有t的行,没有2个或更多t的行,没有1个T和1个t的行。

我正在尝试:

egrep '[tT]{1,1}$' filename

这显示了以下几行:

     nopqrstuvwxyz
     letters    (this line is the one that should not be here)
 The price is *$2*
      one two three (this line should not be here either)
    ONE TWO
 THREE

这些是文件中所有带有 t 或 T 的行。我该怎么办?

【问题讨论】:

  • 您的尝试不会产生您声称的输出。您的正则表达式在行尾查找 t。 (切线,指定任何东西的重复是完全多余的;您的正则表达式可以简化为 [Tt]$。)

标签: linux bash shell scripting grep


【解决方案1】:
$ cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234

$ grep -ix '[^t]*t[^t]*' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -i 忽略大小写
  • -x 仅匹配整行
    • 默认情况下,grep 匹配行中的任何位置
    • 没有-x,你需要grep -i '^[^t]*t[^t]*$'
  • [^t]*t 之外的任何字符(由于-i 选项,T 也将不匹配)


你也可以在这里使用awk

$ awk -F'[tT]' 'NF==2' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -F'[tT]' 指定 tT 作为字段分隔符
  • NF==2 打印如果行包含两个字段,即如果该行有一个 tT

【讨论】:

  • 也许可以详细说明,在没有-x 的情况下,正则表达式匹配一行中任意位置的子字符串被认为是成功的。
【解决方案2】:

如果您正在考虑使用 Perl,以下方法可行

> cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234
> perl -ne ' $x++ for(/t/ig);print if $x==1 ; $x=0 ' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
>

如果您需要精确匹配 2 个匹配项,只需将条件更改为 $x==2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2017-12-25
    • 2011-08-15
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多