【问题标题】:How to remove word from string in shell script如何从shell脚本中的字符串中删除单词
【发布时间】:2020-08-14 10:27:33
【问题描述】:

我想从 shell 脚本中的字符串中删除一个特定的单词。

我的文本文件包含以下数据

***** Failed tests *****
Devices                  Class                Test
Nexus_5_29_2(AVD) - 10   Addition             productCalculation

我想删除DevicesNexus_5_29_2(AVD) - 10

Nexus_5_29_2(AVD) - 10 不是常量,它可能会更改为 Nexus_5_29_1(AVD) - 10Nexus_5_29(AVD) - 10

预期输出是

***** Failed tests *****
Class                Test
Addition             productCalculation

我怎样才能做到这一点? awk 更可取

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。请在您的问题中添加您自己的代码。您应该至少展示自己为解决这个问题所做的研究。
  • @ProBot :那么,你想删除每行的前 n 个字符吗?
  • @Cyrus 我是 shell 脚本的新手。我使用 html2text 解析了 html 文档中的数据。任何我如何坚持这一点。我尝试使用 awk 删除设备名称。但未能删除 (AVD) - 10
  • @user1934428 预期输出有问题。无法指定数字,因为该数据来自 html 报告
  • 考虑回到原始 HTML 并使用 HTML 解析器生成您想要的最终输出,而不是这种中间格式。

标签: bash shell awk sed


【解决方案1】:

使用 sed 进行替换或搜索和删除

sed -i -e 's/Devices//g' filename.txt

awk 解决方案:

cat filename.txt | awk '{print  $2 $3 }'

如你所愿,我需要更多信息。

【讨论】:

  • awk 将不起作用,除非字段分隔符是制表符而不是空格并且如果您这样指定。缺少逗号。还有UUOC。
【解决方案2】:

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

sed -E '/^Devices/{N;s/^\S+\s+(.*\n)Nexus_5_29(_[0-9]+)?\(AVD\) - 10\s+/\1/};P;D' file

如果一行以Devices 开头,则追加下一行,如果第二行与所需的字符串匹配,则删除这两行的第一列及其关联的空格。

注意附加的行可能与第二行的标准不匹配,在这种情况下,应该正常打印第一行,并以第二行代替它重复该过程,这就是PD 命令的原因。所有其他行将正常打印。

根据您描述的标准,上述解决方案可能就足够了。但是,如果需要更通用的解决方案,也许?:

sed -E '/^Devices/{N;s/^\S+\s+(.*\n)\w+_[0-9]+_[0-9]+(_[0-9]+)?\([A-Z]{3}\) - [0-9]+\s+/\1/};P;D' file

【讨论】:

    【解决方案3】:

    假设你的文件只有空格没有制表符,你可以删除除表头以外的行的前n个字符。

    > awk 'NR>1 {$0=substr($0,26)} 1' file
    ***** Failed tests *****
    Class                Test
    Addition             productCalculation
    

    【讨论】:

      【解决方案4】:

      在第二行中找到第二个标题的位置并修剪左侧。

      $ awk 'NR==2{n=match($0,/ [^ ]/)} {print substr($0,n+1)}' file
      
      ***** Failed tests *****
      Class                Test
      Addition             productCalculation
      

      假设每个标题都是一个单词(没有空格)。

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 2016-04-12
        • 2014-11-21
        • 1970-01-01
        • 2012-11-14
        • 2011-02-02
        • 2014-07-03
        相关资源
        最近更新 更多