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