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)
不工作。
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 将打印所有内容。(至少这些工具对我来说是这样工作的。)首先,我们需要调用sed
as 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,因为它用自己替换每个匹配项并按原样打印其他所有内容。
它确实有效,但您没有改变任何东西,或者更确切地说是将其更改为原来的样子。但是只需对这段代码进行很小的修改,您就可以获得所需的内容:
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)
两种方式都适用于提到的网页。