【问题标题】:how to match such repeating pattern? [closed]如何匹配这样的重复模式? [关闭]
【发布时间】:2012-12-28 16:31:03
【问题描述】:

我想匹配模式,789。只使用一个 sed 命令。(没有与“-e”链接的多个命令)

规则是匹配第三个传真之后的号码。

echo "fax 123 def fax tel 456 fax 789 fax 976" | sed 's/xxxxxxx/'

【问题讨论】:

  • 你知道你的分隔符是什么,所以你可以在没有正则表达式的情况下做到这一点。

标签: regex linux unix grep


【解决方案1】:

使用awkfax 作为分隔符:

$ echo "fax 123 def fax tel 456 fax 789 fax ghi" | awk -F'fax ' '{print $4}'
789

sed:

$ echo "fax 123 def fax tel 456 fax 789 fax ghi" | sed 's/.*fax \([0-9]\+\).*/\1/'
789

编辑: sed 是基于行的,那么如何使用 grep 首先拆分字段:

$ echo "fax 123 def fax tel 456 fax 789 fax 976" | egrep -o 'fax (tel )?[0-9]+'
fax 123
fax tel 456
fax 789
fax 976

然后用sed指定哪一行(field)

 $ ... | sed -n '1s/^[^0-9]*//p'
 123

 $ ... | sed -n '2s/^[^0-9]*//p'
 456

 $ ... | sed -n '3s/^[^0-9]*//p'
 789

【讨论】:

  • 谢谢,awk 救了我的命。我想知道是否有办法只用 sed 解决它。匹配重复模式?
  • 我添加了sed 解决方案,如果有帮助,请采纳。
  • 谢谢,但这不是我真正想要的,“.*”让它变得贪婪。所以它将与第 4 份传真之后的号码匹配。我再次编辑了我的问题。谢谢。
  • 查看更新,如果有帮助请告诉我。
  • 感谢您的解决方案,我在下面进行了更新。它仅在 sed 中。
【解决方案2】:

我终于用了这样的命令:

echo "  fax 123 def fax tel 456 fax 789 fax 012" |  
sed -e 's/^\s*fax\s*[0-9a-z]*\s*[a-z0-9]*\s*fax\s*[0-9a-z]*\s*[0-9a-z]*\s*fax\s*\([0-9]*\).*$/\1/'

【讨论】:

  • 尝试使用它来打印第 88 个字段:|
  • 我知道我的命令很丑,但我的条件是我只能使用一个搜索命令。它实际上是在Google电子表格中的RegexExtract()中使用XDDD
  • 现在有道理了,这就是你应该问的问题!你会得到更好的答案。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2020-10-27
相关资源
最近更新 更多