【问题标题】:bash scripting - using sed or awk to split and extract databash 脚本 - 使用 sed 或 awk 拆分和提取数据
【发布时间】:2019-01-29 19:06:41
【问题描述】:

我遇到了特定情况。如果我有一个包含以下条目的文件:

my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see

使用 bash,我如何使用 awk 或 sed 之类的东西将每行的数据用“。”分割。然后只打印直接在last“.”之前和之后的条目,忽略没有“.”的行?

期望的输出:

example.com
somelinewithnodot
this.is
all.I
need.2see

我一直在尝试使用 sed,但在设置正则表达式时遇到了问题。我以前做过这样的事情,但已经过了一分钟,我无法记住如何正确设置它......

【问题讨论】:

  • 为什么不只是 grep? grep -Eo '([^.]+\.)?[^.]+$'
  • 始终建议您在帖子中添加您为解决问题所做的努力,请这样做@Jon Red
  • @oguzismail 我很难设置正则表达式,我已经过了一分钟了。不过,我最终还是使用了 awk,因为事实证明它是解决这个特定难题的更简单的解决方案。

标签: regex awk sed dns


【解决方案1】:

请您尝试关注一下。

awk -F'.' 'NF>1{print $(NF-1) FS $NF;next} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file

awk -F'.' 'NF>1{$0=$(NF-1) FS $NF} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file

【讨论】:

  • 我在尝试使用 sed 和正则表达式时迷路了,而这正是我真正需要的。这是完美的,非常感谢你......
  • @JonRed,很高兴它对您有所帮助,给它一些时间,当您看到一些答案时,尝试选择正确答案,在这个伟大的网站上欢呼并快乐学习。
【解决方案2】:

您可以使用 sed 替换:

sed 's/^\([^.]*\.\)*\([^.]\+\.[^.]\+\)$/\2/'

【讨论】:

  • 这是我很难构建的。我最终使用了 awk,因为它对我的示例来说更简单,但这是我最初尝试的。
【解决方案3】:

这可能对你有用(GNU sed):

sed -E 's/.*[.](.*[.].*)$/\1/' file

匹配最后两个 . 并将它们替换为最后一个 . 和两边的单词。

替代方案:

sed 's/.*\.\(.*\..*\)$/\1/' file

【讨论】:

    【解决方案4】:

    你也可以试试 Perl

    perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" '
    

    带输入

    $ cat johnred.txt
    my.site.example.com
    somelinewithnodot
    some.line .with.a.weird.space..this.is
    this.one.has , and.stuff*.all.I
    &&&83%23^&4,I;dont,even.need.2see
    
    $ perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" ' johnred.txt
    example.com
    somelinewithnodot
    this.is
    all.I
    need.2see
    
    $
    

    .在[ ]中使用时失去了特殊意义,所以可以使用

    perl -ne ' /(^[^.]+$)|(?<=\.)([^.]+\.[^.]+$)/g and print "$1$2" ' johnred.txt
    

    使用数组操作的另一种解决方案

    perl -lne ' @b=$_=~/([^.]+)/g ; print $b[-2]? "$b[-2].":"", $b[-1] ' johnred.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2020-09-26
      • 2018-03-26
      • 2021-11-28
      • 2022-01-13
      • 2013-08-17
      相关资源
      最近更新 更多