如何从shell脚本中的字符串中删除单词

问题描述

我想从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更可取

解决方法

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

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

Awk解决方案:

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

要做你想做的事,我需要更多信息。

,

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

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

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

附加的行可能与第二行的条件不匹配,在这种情况下,第一行应正常打印,并重复执行该过程,并替换第二行,因此是P和{{1}的原因}命令。其他所有行将照常打印。

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

D
,

假设您的文件只有空格且没有制表符,则可以删除标题以外的行的前n个字符。

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

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

$ awk 'NR==2{n=match($0,/ [^ ]/)} {print substr($0,n+1)}' file

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

假设标头每个都是一个字(不带空格)。