如何使用 SED 或 AWK 从 txt 文件中删除特定数字?

如何使用 SED 或 AWK 从 txt 文件中删除特定数字?

我在一家公司工作,该公司不允许我在计算机上安装任何软件,而且我在那里运行的 Windows 很糟糕。

我需要清理很多从内网复制的文本并保存为txt文件。所以我必须使用sed和/或awk在线实时编辑器,例如或者

这些文字是这样的

01

010010-26.2010.501.0026  fafas fasdf asdf asdfsadf asdfasd fasd asasdff

fdfsadf adsf adsf asdf asdfas fadsf asdfa

02

0011-15.2016.501.0012  fafas fasdf asdf asdfsadf asdfasd fasd asasdff
asdfasd fasd asasdff
asdfasd fasd asasdff
0011-125.2013.501.0012
asdfasd fasd asasdff

看到这样的数字0011-15.2016.501.0012就是我想要的。我不关心其余的,但我想用所有这些数字创建一个新的干净文本,每行一个。在前面的示例中,我需要一个文本

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012

在所有数字中, the.501.始终作为第四组出现。

我已经在 sed 在线编辑器上尝试过这个命令

's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\)/\1/'

不工作。

答案1

它确实有效,但您不会改变任何东西,或者更确切地说,将其更改为原来的样子。但只需对此代码进行很小的修改,您就可以得到您想要的:

sed -n 's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\).*/\1/p'

注意三件事:

  • -nswitch,表示默认不打印任何内容
  • .*在选择的组的末尾(...)
  • p作为最后一个命令意味着打印这一行

结果:

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012

顺便说一句,您可以通过添加和使用扩展正则表达式来简化一点-E,即去掉捕获组前面的反斜杠:

sed -E -n 's/([0-9]*-[0-9]*\.[0-9]*\.501\.[0-9]*).*/\1/p'

两种方法都适用于上述网页。

答案2

使用 AWK 相当简单,b/c 通常 AWK 不执行任何操作,因此我们只需要告诉它何时执行操作,即在行首打印 ID(如果存在)

/^[0-9]+-[0-9]+\.[0-9]+\.501\.[0-9]+/{
    print $1
}

对于 sed 来说有点不同,b/c 默认情况下 sed 会打印所有内容。 (至少这些工具对我来说是这样工作的。)首先,我们需要调用sedas 来sed -n将其默认行为更改为不执行任何操作。那么我们就可以

s/^\([0-9]\+-[0-9]\+\.[0-9]\+\.501\.[0-9]\+\).*$/\1/p

我们需要p在最后告诉 sedp如果我们有匹配的模式,则打印结果。您特定的 sed 表达式是诺普因为它会用自身替换每个匹配项并按原样打印其他所有内容。

相关内容