Kos*_*hur 31 sed text-processing
假设我在文本文件中有一个 URL 列表:
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
Run Code Online (Sandbox Code Playgroud)
我想删除“.com”之后的所有内容。
预期成绩:
google.com
unix.stackexchange.com
isuckatunix.com
Run Code Online (Sandbox Code Playgroud)
我试过
sed 's/.com*//' file.txt
Run Code Online (Sandbox Code Playgroud)
但它也删除.com
了。
Jef*_*ler 29
要明确删除“.com”之后的所有内容,只需调整您现有的 sed 解决方案以将“.com(anything)”替换为“.com”:
sed 's/\.com.*/.com/' file.txt
Run Code Online (Sandbox Code Playgroud)
我调整了你的正则表达式以避开第一期;否则它会匹配“thisiscommon.com/something”之类的东西。
请注意,您可能希望使用尾部正斜杠进一步锚定“.com”模式,以便您不会意外修剪诸如“sub.com.domain.com/foo”之类的内容:
sed 's/\.com\/.*/.com/' file.txt
Run Code Online (Sandbox Code Playgroud)
Pan*_*dya 14
您可以通过以下方式使用awk
的字段分隔符 ( -F
):
$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
Run Code Online (Sandbox Code Playgroud)
$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com
Run Code Online (Sandbox Code Playgroud)
解释:
NAME
awk - pattern scanning and processing language
Run Code Online (Sandbox Code Playgroud)
-F fs
--field-separator fs
Use fs for the input field separator (the value of the FS predefined variable).
Run Code Online (Sandbox Code Playgroud)
由于您想删除之后的所有内容.com
,-F '.com'
将行与分隔开.com
并print $1
仅输出之前的部分.com
。因此,$1".com"
添加.com
并为您提供预期的输出。
非交互式就地文件编辑的最佳工具是ex
.
ex -sc \'%s/\\(\\.com\\).*/\\1/ | x\' file.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n如果您使用过vi
并且曾经键入过以冒号开头的命令,那么:
您就使用过 ex 命令。当然,您可以通过这种方式执行的许多更高级或“奇特”的命令是 Vim 扩展(例如:bufdo
),并且没有在 的POSIX 规范ex
中定义,但这些规范在非可视化方面提供了真正令人惊讶的强大功能和灵活性。文本编辑(无论是交互式还是自动)。
上面的命令有几个部分。
\n\n-s
启用静音模式以准备ex
批量使用。(抑制输出消息等)
-c
file.txt
指定在缓冲区中打开文件(在本例中为 )后要执行的命令。
%
是一个地址说明符,相当于1,$
\xe2\x80\x94,这意味着以下命令将应用于缓冲区的所有行。
s
是您可能已经熟悉的替代命令。它通常用于 且与的命令vi
具有基本相同的功能,但某些高级正则表达式功能可能因实现而异。在这种情况下,从“.com”到行尾将仅替换为“.com”。s
sed
竖线分隔要执行的顺序命令。在许多(大多数)ex
实现中,您还可以使用附加-c
选项,如下所示:
ex -sc \'%s/\\(\\.com\\).*/\\1/\' -c x file.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n然而,POSIX 并不要求这样做。
\n\nx
将任何更改写入文件后,该命令退出。wq
与“写入并退出”不同,仅x
在缓冲区已被编辑时才写入文件。因此,如果您的文件未更改,时间戳将被保留。