关于特定URL字符串操作的bash脚本

时间:2019-04-29 10:36:51

标签: bash

我需要操纵一个我不知道长度的字符串(URL)。

字符串类似于

https://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring

我基本上需要一个返回以下内容的正则表达式:

https://x.xx.xxx.xxx/keyword/restofstring x是当前的ip,每次都可以变化,我不知道dontcares的数量。

我实际上不知道该怎么做,已经花了2个小时了,但是没有找到解决方案。

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以按以下方式使用sed

sed -E 's=(https://[^/]*).*(/keyword/.*)=\1\2='

s表示替代,格式为s= 搜索模式 = 替换模式 =。< br /> 搜索模式是一个正则表达式,我们在其中将(...)要提取的部分分组。
替换模式使用\1\2访问这些组。

您可以将文件或标准输入提供给sed,它将逐行处理输入。
如果您有一个字符串变量,并使用bashzsh或类似的名称,则也可以使用<<<将该变量直接输入stdin中。

bash用法示例:

input='https://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring'
output="$(sed -E 's=(https://[^/]*).*(/keyword/.*)=\1\2=' <<< "$input")"
echo "$output" # prints https://x.xx.xxx.xxx/keyword/restofstring

答案 1 :(得分:0)

echo "https://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring" | sed "s/dontcare[0-9]\+\///g"

sed用于处理文本。 dontcare[0-9]\+\///g是正则表达式dontcare[0-9]+/的转义形式,它与单词“ dontcare”相匹配,后跟1个或多个数字,后跟/字符。

sed的模式如下:s/find/replace/g,其中g是一个命令,可让您匹配多个模式实例。

您可以看到正则表达式在运行中here

请注意,这假设字符串的其余部分中没有dontcareN。如果是这样,Socowi的答案会更好。

答案 2 :(得分:0)

您还可以将read的{​​{1}}值与/一起使用,以分析垃圾。

$IFS

$: IFS=/ read proto trash url trash trash trash keyword rest <<< "https://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring" $: echo "$proto//$url/$keyword/$rest" https://x.xx.xxx.xxx/keyword/restofstring 值未知且不可预测的字符串时,这种说法更为笼统。

虽然我更喜欢Socowi's answer,但这是纯粹的bash。

答案 3 :(得分:0)

这里有一个sed变体,它从路径中挑选出主机部分和最后两个组件。

url='http://example.com:1234/ick/poo/bar/quux/fnord'
newurl=$(echo "$url" | sed 's%\(https*://[^/?]*[^?/]\)[^ <>'"'"'"]*/\([^/ <>'"''"]*/^/ <>'"''"]*\)%\1\2%')

一般格式为sed 's%pattern%replacement%',其中 pattern 匹配到主机名部分的末尾(捕获到一组反斜杠中),然后跳过倒数第二个斜杠,然后捕获URL的其余部分,包括最后一个斜杠;而替换只需调用两个捕获的组,而无需跳过它们之间的部分。