我需要操纵一个我不知道长度的字符串(URL)。
字符串类似于
https://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring
我基本上需要一个返回以下内容的正则表达式:
https://x.xx.xxx.xxx/keyword/restofstring x是当前的ip,每次都可以变化,我不知道dontcares的数量。
我实际上不知道该怎么做,已经花了2个小时了,但是没有找到解决方案。
谢谢!
答案 0 :(得分:1)
您可以按以下方式使用sed
:
sed -E 's=(https://[^/]*).*(/keyword/.*)=\1\2='
s
表示替代,格式为s=
搜索模式 =
替换模式 =
。< br />
搜索模式是一个正则表达式,我们在其中将(...)
要提取的部分分组。
替换模式使用\1
和\2
访问这些组。
您可以将文件或标准输入提供给sed
,它将逐行处理输入。
如果您有一个字符串变量,并使用bash
,zsh
或类似的名称,则也可以使用<<<
将该变量直接输入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的其余部分,包括最后一个斜杠;而替换只需调用两个捕获的组,而无需跳过它们之间的部分。