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

Duc*_*uck 4 sed awk text-processing

我在一家不允许我在我的电脑上安装任何软件的公司工作,而且我在那里运行的窗口很糟糕。

我需要清理很多我从内网复制的文本并保存为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
Run Code Online (Sandbox Code Playgroud)

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

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012
Run Code Online (Sandbox Code Playgroud)

.501.始终存在,在所有的数字,是4组。

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

's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\)/\1/'
Run Code Online (Sandbox Code Playgroud)

不工作。

Ban*_*uin 7

AWK 是相当直接的,b/c 通常 AWK 不做任何事情,所以我们只需要告诉它什么时候做事情,即在行的开头打印 ID,如果它在那里

/^[0-9]+-[0-9]+\.[0-9]+\.501\.[0-9]+/{
    print $1
}
Run Code Online (Sandbox Code Playgroud)

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

s/^\([0-9]\+-[0-9]\+\.[0-9]\+\.501\.[0-9]\+\).*$/\1/p
Run Code Online (Sandbox Code Playgroud)

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


jim*_*mij 7

它确实有效,但您没有改变任何东西,或者更确切地说是将其更改为原来的样子。但是只需对这段代码进行很小的修改,您就可以获得所需的内容:

sed -n 's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\).*/\1/p'
Run Code Online (Sandbox Code Playgroud)

注意三点:

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

结果:

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012
Run Code Online (Sandbox Code Playgroud)

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

sed -E -n 's/([0-9]*-[0-9]*\.[0-9]*\.501\.[0-9]*).*/\1/p'
Run Code Online (Sandbox Code Playgroud)

两种方式都适用于提到的网页。