gpt4 book ai didi

regex - Linux命令sed中的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:50 24 4
gpt4 key购买 nike

我有一个 shell 变量:

all_apk_file="a 1 2.apk x.apk y m.apk"

我想用 TEST 替换 a 1 2.apk,使用命令:

echo $all_apk_file | sed 's/(.*apk ){1}/TEST/g'

.*apk表示以apk结尾,{1}表示只匹配一次,但不生效;我只得到原始变量作为输出:a 1 2.apk x.apk y m.apk

谁能告诉我为什么?

最佳答案

首先,要在 sed 中启用您熟悉的正则表达式,您需要使用 -r 开关(sed < strong>-r ...):

echo $all_apk_file | sed -r 's/(.*apk ){1}/TEST/g'
# returns TESTy m.apk

看看它返回了什么:TESTy m.apk。这是因为 .*贪婪的,所以它尽可能多地匹配。也就是说,.* 匹配 a 1 2.apk x,并且您已经说过要替换 .*apk,因为 a 1 2.apk x.apk with 'TEST',结果是 TESTy m.apk(注意正则表达式中 '.apk' 后面的空格,即为什么匹配没有一直延伸到最后一个“.apk”,它后面没有空格)。

通常可以将 .* 更改为 .*? 以使其非贪婪,但 sed 不支持此行为.

因此,要修复它,您只需使正则表达式更具限制性即可。

很难说出您想做什么 - 删除第三个以“.apk”结尾的前三个单词并替换为“TEST”?在这种情况下,可以使用正则表达式:

[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk

结合“i”开关(不区分大小写)。

您必须提供您的逻辑来决定要删除的内容(前三个词、任意数量的词直到第一个“.apk”词等),以便我们帮助您进一步使用正则表达式。

其次,您已将“g”开关置于您的正则表达式中。这意味着将替换所有 匹配模式,而您似乎只想替换第一个。所以移除“g”开关。

最后,所有这些结合起来:

echo $all_apk_file | sed -r 's/[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk/TEST/i'
# TEST x.apk y m.apk

关于regex - Linux命令sed中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9388817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com