假设我有一个包含大量 URL 的输出文件。我如何使用 awk 或 sed 删除 URL 的一部分,以便最终结果http://example.com
是http://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