如何使用 awk 或 sed 删除 http://example.com 之后的所有内容

如何使用 awk 或 sed 删除 http://example.com 之后的所有内容

假设我有一个包含大量 URL 的输出文件。我如何使用 awk 或 sed 删除 URL 的一部分,以便最终结果http://example.comhttp://example.com/folder/file.html.

答案1

要删除第一个单独的(不是双重的)之后的所有内容/

sed -r 's#([^/])/[^/].*#\1#'

该表达式s#([^/])/[^/].*#\1#将使用正则表达式执行替换([^/])/[^/].*。这将匹配不是/后跟单个字符/(以及输入行末尾的其他字符)的任何字符。

替换将匹配项替换为单个字符前面的字符/(否则该字符将被替换掉)。

在文件上测试它

http://example.com/folder/file.html
http://example.bar.com/folder/file.html
http://example.com:8080/folder/file.html
$ sed -r 's#([^/])/[^/].*#\1#' file
http://example.com
http://example.bar.com
http://example.com:8080

使用awk

$ awk -F'/' '{ print $1 "//" $3 }' file
http://example.com
http://example.bar.com
http://example.com:8080

在这里,我使用/作为字段分隔符,然后我只需挑选第一个和第三个字段并使用//中间的字符串输出它们。

答案2

你可以使用sed

 sed 's#^\(https\?://\)\?\([^/]*\)/.*#\1\2#' filename

使用此命令和以下文件,

http://example.com/foo/bar.html
https://example.com/foo/bar.html
example.com/foo/bar.html

输出将是

http://example.com
https://example.com
example.com

其工作方式如下

  • \(https\?://\)\?最多匹配 1 次出现http://https://。括号捕获匹配项\1

  • \([^/]*\)匹配此后直到下一个的任何内容/,并且匹配被捕获在\2

  • /.*与该行的其余部分匹配。

答案3

用于sed去除 URL 的尾随部分,假设它们是每行一个或以空格分隔:

sed 's!\(http://[^/]*\)[^ ]*!\1!g' < input > output

这使用了 sed 的搜索和替换功能;模式、替换和标志之间的分隔符设置在!此处。

要匹配的模式是:

  • http://后跟除正斜杠之外的任何内容——模式的这一部分在括号中捕获为“组 1”
  • (除空格之外的任何内容),零次或多次——这是 URL 的尾部部分,特别是不是捕获在括号中

替代品是:

  • 先前捕获的“组 1”

标志是:

  • 全局执行此g操作,意味着每行执行尽可能多的次数

答案4

对于大文件grep可能会很快完成工作。语法也很容易记住。

grep -Eo '^https?://[^/]+' fname

使用sed不需要超过

sed -r 's|(https?://[^/]*).*|\1|' fname

或者cut不使用困难的正则表达式

cut -d'/' -f1,2,3 fname

相关内容