如何删除文件中特定模式或字符串之后的每一行的其余部分?

如何删除文件中特定模式或字符串之后的每一行的其余部分?

假设我在文本文件中有一个 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'因此将行分隔开.comprint $1仅输出之前的部分.com。因此,$1".com"添加.com并给出您预期的输出。

答案3

非交互式就地文件编辑的最佳工具是ex.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

如果您使用过vi并且曾经键入过以冒号开头的命令,那么:您就使用过 ex 命令。当然,您可以通过这种方式执行的许多更高级或“花哨”的命令都是 Vim 扩展(例如:bufdo)并且没有在POSIX 规范ex,但这些规范允许非可视文本编辑(无论是交互式还是自动化)具有真正惊人的功能和灵活性。

上面的命令有几个部分。

-s启用静音模式以准备ex批量使用。 (抑制输出消息等)

-cfile.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
    

相关内容