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

特定URL字符串操作的bash脚本,bash,Bash,我需要操纵一个我不知道长度的字符串(URL) 这根绳子有点像 我基本上需要一个正则表达式,它返回: 其中,x是当前ip,每次都可能变化,我不知道DontCare的数量 实际上我不知道怎么做,我花了2个小时研究这个问题,但没有找到解决办法 谢谢 您可以按如下方式使用sed: sed -E 's=(https://[^/]*).*(/keyword/.*)=\1\2=' s代表替换,其形式为s=搜索模式=替换模式= 搜索模式是一个正则表达式,我们在其中对要提取的部分进行分组。 替换模式使用\1

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

这根绳子有点像

我基本上需要一个正则表达式,它返回:

其中,x是当前ip,每次都可能变化,我不知道DontCare的数量

实际上我不知道怎么做,我花了2个小时研究这个问题,但没有找到解决办法


谢谢

您可以按如下方式使用
sed

sed -E 's=(https://[^/]*).*(/keyword/.*)=\1\2='
s
代表替换,其形式为
s=
搜索模式
=
替换模式
=

搜索模式是一个正则表达式,我们在其中对要提取的部分进行分组。
替换模式使用
\1
\2
访问这些组

您可以将文件或stdin馈送到
sed
,它将逐行处理输入。
如果您有一个字符串变量并使用
bash
zsh
或类似的东西,您也可以使用
echo将该变量直接输入stdinhttps://x.xx.xxx.xxx/dontcare1/dontcare2/dontcareN/keyword/restofstring“| sed”s/dontcare[0-9]\+\///g”

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

sed的模式是这样工作的:
s/find/replace/g
,其中g是一个允许您匹配多个模式实例的命令

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


请注意,这假设字符串的其余部分中没有
dontcareN
s。如果是这种情况,那么,'s的答案会更好。

您还可以使用
read
/
值作为
$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

$:IFS=/read proto-trash url trash关键字rest这里有一个
sed
变体,它从路径中选择主机部件和最后两个组件

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

一般形式是
sed的%pattern%replacement%
,其中模式通过主机名部分的结尾匹配(捕获到一组反斜杠括号中)然后跳过倒数第二个斜杠,然后捕获URL的其余部分,包括最后一个斜杠;替换者只需调用两个捕获的组,而不包含它们之间的跳过部分。

很好,您正在努力解决自己的问题,因此我们鼓励所有成员在其帖子中添加他们的努力,非常感谢请这样做,然后让我们知道。这里有很多答案。如果其中一个解决了您的问题,您应该接受。如果您的问题没有解决,请编辑您的问题并指出原因。这是正确的,但我们用任何字符串替换
dontcare
都应该有效。对于
\+
,我必须在本地转义,以便命令正确工作根据我的理解,它可能被解释为一个算术运算符,但它也清楚地表明它应该在这里起作用:啊,我明白了。我没有想到
sed
sed-E
之间的区别。因为
sed-E
\+
是一个文字,但对于
sed
它是一个量词。然而,“用任何字符串替换
dontcare
“可能比看起来要难一些。我猜OP希望匹配的不是
关键字
而不是
dontcare
,因此您必须反转regex
/keyword/
,这在
sed
中并不容易。啊!我明白你的意思。那么,我不确定OP在这里解释的方法是什么。如果目的是针对
/keyword/
的位置,那么你的答案是正确的(我的答案不是),但是如果目的是找到
/dontcareN/
,那么我的答案应该是正确的。这个问题的形式没有清楚地解释它的意图,至少对我来说是这样。
url='http://example.com:1234/ick/poo/bar/quux/fnord'
newurl=$(echo "$url" | sed 's%\(https*://[^/?]*[^?/]\)[^ <>'"'"'"]*/\([^/ <>'"''"]*/^/ <>'"''"]*\)%\1\2%')