如何使用sed/grep/regex删除第3次出现字符后的所有内容



我需要一些帮助:寻找一种方法来删除"/"在超链接中使用类似的命令

cat text.txt | grep -o "^((?:[^/]*/){5}).*$"

这个命令对我不起作用。例如,如果我有

https://www.forbes.com/forbes/welcome/?toURL=https://forbes.com/&refURL=&referrer=

我想要的输出是:

https://www.forbes.com/forbes/welcome/

此外,如果链接只有<4/,我想保留所有东西。

第一个解决方案: 使用awk,请尝试以下操作。它应该涵盖/??出现在URL中的两种情况(实际请求中可能是这种情况(。只需将Input_file的所有行的字段分隔符设置为/?\?,如果行从httphttps开始,则打印行的第一个字段。

awk -F'/?\?' '/^https?:///{print $1}' Input_file


第二个解决方案:使用GNUawk及其match函数,请尝试以下解决方案,与第一个解决方案相比没有什么复杂,但如果您需要检查更多的值,除了在?之前获取值之外,您可以尝试它,因为它可以将值保存到数组中,因此可以帮助您。

awk 'match($0,/^(https?://([^?]*))?/,arr1){print arr1[1]}' Input_file

假设?问号可以从哪里排除,您可以尝试此sed

$ sed 's/?.*//' input_file
https://www.forbes.com/forbes/welcome/

您可以匹配协议,如果可用,请使用grep-P在它之后重复3次/匹配的非捕获组:

grep -oP "^https?://(?:[^/]*/){3}" text.txt

或grep-E重复捕获组:

grep -oE "^https?://([^/]*/){3}" text.txt

或者只是用正确的转义grep-o

grep -o "^https?://([^/]*/){3}" text.txt

示例

echo "https://www.forbes.com/forbes/welcome/?toURL=https://forbes.com/&refURL=&referrer=" | grep -oP "^https?://(?:[^/]*/){3}"

输出

https://www.forbes.com/forbes/welcome/

请注意,您不必使用cat text.txt |

您可以使用这个grep,它可以在任何版本的grep:中工作

grep -oE '([^/]*/){5}' file
https://www.forbes.com/forbes/welcome/

类似地,这个sed也可以工作:

sed -E 's~(([^/]*/){5}).*~1~' file
https://www.forbes.com/forbes/welcome/

这两种解决方案都将获取由/分隔的前5个令牌。

awk 'NF<_||NF=_' FS=/ OFS=/ _=5

如果?问号可以从哪里排除,您可以尝试:

cut -d '?' -f1 input_file

最新更新