【问题标题】:Using sed and awk to edit lines in a file使用 sed 和 awk 编辑文件中的行
【发布时间】:2017-10-11 20:02:05
【问题描述】:

我有一个由空格分隔的几个主机名的文件,然后是一个位置。

host1 C1U5  
host2 C11U55  
host15 C5U10

我必须编辑主机文件。我已经编写了 sed/awk 行来删除字符,但我的 sed 行只返回整行。我需要删除该行的 Cxx 部分。

awk '{print $2}' file | sed -e 's/([Cc][0-9].\\w+//g' | tee new new_file

输出应该看起来像

host1 5  
host2 55  
host15 10

【问题讨论】:

  • 或者我可以使用 sed -e 's/([U][0-9]\\w+//g'
  • 你能粘贴你的输出应该是什么样子吗?问题不清楚。最终输出是否应该只有 host1、host2... 等等?
  • @MatiasBarrios 我做了编辑。

标签: regex linux bash awk sed


【解决方案1】:

这将从您的第二个字段中删除除最后一个数字之外的所有数字,您应该获得所需的输出。

 awk '{ sub(/C[0-9]+\w/,"",$2); print $1,$2 }' f1

输出:

host1 5
host2 55
host15 10

【讨论】:

  • 为什么选择 gsub?在这种情况下,您应该选择 sub。
  • @MarcLambrichs:这里没关系,因为每个字段最多有一场比赛。但是是的,考虑到性能 sub 根据基准测试更好。我会考虑到它,也会更新。谢谢
【解决方案2】:

awk解决方案:

$ awk '{sub(/C[0-9]+[^0-9]+/,"",$2)}1' file
host1 5
host2 55
host15 10

解释正则表达式:

C              # C
[0-9]+         # followed by 1 or more digits
[^0-9]+        # followed by 1 or more non-digits

sed 解决方案:您可以使用相同的正则表达式

$ sed -E 's/C[0-9]+[^0-9]+//' file

【讨论】:

  • @batMan 谢谢。希望您同意 gsub/sub 的评论。
【解决方案3】:

遵循 awk 也可能对您有所帮助。

awk -F'C[0-9]+\\w' '{print $1,$2}'  Input_file

输出如下。

host1  5
host2  55
host15  10

【讨论】:

    【解决方案4】:

    Sed 解决方案:

    ubuntu$ sed -E 's/.*(^[a-zA-Z0-9]+[ ])([C][0-9]*[U])([0-9]+).*/\1 \3/g' mytext.txt
    host1  5
    host2  55
    host15  10
    

    问候!

    【讨论】:

      【解决方案5】:
      awk '{sub(/C.*U/,"")}1' file
      
      host1 5  
      host2 55  
      host15 10
      

      会发生什么?

      sub 删除两个正斜杠之间的所有内容。

      来自 C 和 .=任何值的单个字符

      *= U 前面的零个或多个字符。

      ,""= 这里 sub 擦除正斜杠之间的内容。

      最后 1 打印剩下的内容。

      【讨论】:

      • 这将删除CPU 甚至CUC 后面应该跟一个数字。除此之外,这个解决方案看起来非常接近我的......
      猜你喜欢
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2023-01-24
      • 2015-02-27
      • 2018-01-08
      • 2013-01-07
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多